Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 粘贴";::&引用;及;"富",;未提供有效的预处理令牌_C++_Macros_Preprocessor Directive - Fatal编程技术网

C++ 粘贴";::&引用;及;"富",;未提供有效的预处理令牌

C++ 粘贴";::&引用;及;"富",;未提供有效的预处理令牌,c++,macros,preprocessor-directive,C++,Macros,Preprocessor Directive,我想将MyNamespace::附加到宏定义的函数: #define transFunc(func) \ dimensionedScalar func(const dimensionedScalar& ds) \ {

我想将MyNamespace::附加到宏定义的函数:

#define transFunc(func)                                                    \
dimensionedScalar func(const dimensionedScalar& ds)                        \
{                                                                          \
    if (!ds.dimensions().dimensionless())                                  \
    {                                                                      \
        FatalErrorIn(#func "(const dimensionedScalar& ds)")                \
            << "ds not dimensionless"                                      \
            << abort(FatalError);                                          \
    }                                                                      \
                                                                           \
    return dimensionedScalar                                               \
    (                                                                      \
        #func "(" + ds.name() + ')',                                       \
        dimless,                                                           \
        MyNameSpace::##func(ds.value())                                                 \
    );                  

                                               \
编译器抛出以下错误:

粘贴“::”和“Foo”不提供有效的预处理令牌

上面连接令牌的方式有什么问题

##
用于将两个令牌组合在一起,形成一个令牌。因此类似于
func##1
的内容将扩展到单个令牌
func1

在这里使用它,它尝试将
Foo
组合在一起,以生成一个标记
::Foo
。正如错误所说,这不是有效的令牌。你不需要这里的一个令牌;您只需要将这两个令牌分开:

MyNameSpace::func(ds.value())
##
适用于宏,它不适用于常规代码

您可以按如下方式进行操作:

#define ADD_NAMESPACE(NS,FUNC) NS##::##FUNC
现在您可以这样使用它:

ADD_NAMESPACE(std,cout)<<x1<<ADD_NAMESPACE(std,endl);
std ## :: ## cout<<std ## :: ## endl;
ADD_NAMESPACE(std,cout)正如其他人所说,##在编译的标记化阶段(或之后)连接两个标记:

a##b => (a) ## (b) => (ab)
( possibly invalid, like (::bar) instead of (::), (bar) )
请注意,这不会通过标记器将连接的标记标识符发送回,编译阶段已经完成。可能会让您混乱的是,这些标记现在是标记,不再是原始字符串


当我(晚到派对)来这里寻找同样的信息时,如果事情仍然不合理,这里有一个foo.cpp示例:

#define FOO(a) Something::a

int main()
{
        FOO( bar );
        FOO( cat );

        return 0;
}
gcc-E foo.cpp生成

# 1 "foo.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "foo.cpp"



int main()
{
 Something::bar;
 Something::cat;

 return 0;
}
#1“foo.cpp”
# 1 ""
# 1 ""
#1“/usr/include/stdc predef.h”1 3 4
# 1 "" 2
#1“foo.cpp”
int main()
{
酒吧;
猫;
返回0;
}

在函数中添加前缀怎么样,例如“\ux”:

dimensionedScalar _##func(const dimensionedScalar& ds)                        
然后您可以将“u”与func连接起来:

MyNameSpace::_##func(ds.value())

我可以不高兴地问,为什么这需要是一个宏,而不是一个模板函数?我们现在还有
std::function
。@Bathsheba,这是一个开源项目的代码。我正在将double-type重载到我的用户定义的数据类型中。但是当它将::和Foo绑定到make::Foo时,它最终会给出Mynamespace::Foo。我看不出这有什么不对…@cpp\u noname如果你用普通代码写
Mynamespace::Foo
,它是三个标记:
Mynamespace
Foo
@cpp\u noname:标记不一定用空格分隔:)@cpp\u noname:不,这被解析为三个独立的标记,
Mynamespace
,<代码>::和 Foo,它们之间形成了一个有效的C++表达式。代码>::Foo
作为单个令牌无效。这就是
###
的(不正确)用法试图创建的。哪个编译器成功了?例如,GCC4.8.3抛出的错误与原始帖子中的错误相同,但现在关于
NS
;然而,简单地编写Mike Seymour的答案中的
MyNameSpace::func(ds.value())
是可行的——尽管简化的解析器,如KDevelop的内置分析器,可以从字面上理解这一点。@AntonSamsonov I添加了gcc版本的完整示例。如果你有迷路的错误,我想你试过
std::#cout
# 1 "foo.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "foo.cpp"



int main()
{
 Something::bar;
 Something::cat;

 return 0;
}
dimensionedScalar _##func(const dimensionedScalar& ds)                        
MyNameSpace::_##func(ds.value())