c++ - 粘贴 "::"和 "Foo"不会提供有效的预处理 token

标签 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())                                                 \
    );                  

                                               \

但是当我打电话的时候

transFunc(Foo)

编译器抛出以下错误:

pasting "::" and "Foo" does not give a valid preprocessing token

我上面连接标记的方式有什么问题?

最佳答案

## 用于将两个标记组合在一起以形成单个标记。所以像 func##1 这样的东西会扩展为单个标记 func1

在此处使用它,它会尝试将 ::Foo 结合在一起以生成单个标记 ::Foo。正如错误所说,这不是有效的 token 。您不需要这里的单个 token ;您只想将两个标记分开:

MyNameSpace::func(ds.value())

关于c++ - 粘贴 "::"和 "Foo"不会提供有效的预处理 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27361170/

相关文章:

c++ - 提示用户说明

c++ - 这是私有(private)构造函数的一个很好的用途吗?

text - 我怎样才能使用格式! no_std 环境中的宏?

C++ 停止预处理器宏扩展

c++ - constexpr 可以替换实例化模板并使用传递的参数两次的宏吗

c++ - 求一系列数字加减后的最小值和最大值

c++ - 我们可以在一个 STL 列表中保存 2 种数据类型吗?

c++ - 十六进制转储宏 (C/C++)

c - 大端交换宏 "uswap"导致意外错误

c++ - 检查是否定义了 uint64_t