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

cpp*_*ame 3 c++ macros preprocessor-directive

我想将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())                                                 \
    );                  

                                               \
Run Code Online (Sandbox Code Playgroud)

}

但是当我打电话时

transFunc(Foo)
Run Code Online (Sandbox Code Playgroud)

编译器抛出以下错误:

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

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

Mik*_*our 6

##用于将两个令牌组合在一起以制作单个令牌.所以类似的东西func##1会扩展到单个令牌func1.

在这里使用它,它试图一起躲避::并Foo制作一个令牌::Foo.正如错误所说,这不是有效的令牌.你不想在这里有一个令牌; 你只想保持两个令牌分开:

MyNameSpace::func(ds.value())
Run Code Online (Sandbox Code Playgroud)

  • @cpp_noname如果你在普通代码中编写`Mynamespace :: Foo`,那就是三个标记:`MyNamespace`,`::`和`Foo`. (2认同)