c++ - 带有命名空间的 Concat 宏参数

标签 c++ c-preprocessor

我有一个宏,其中一个参数是一个枚举值,它在没有指定命名空间范围的情况下给出。但是在宏内部的某处我需要访问它(显然我必须在那里定义 namespace ),但我似乎无法将 namespace 名称与模板参数连接起来。给定以下示例代码,编译器会提示 粘贴::和 Val 没有提供有效的预处理器标记(尽管它可以很好地连接 get 和 a 到 getVal)。

 namespace TN
 {
    enum Info
    {
        Val = 0
    };
 }

#define TEST(a) TN::Info get ## a(){return TN::##a;}
TEST(Val)

那么有什么方法可以在不使用另一个参数并且基本上指定要使用两次的值的情况下完成这项工作(例如 #define TEST(a,b) TN::Info get ## a(){return b;})?

最佳答案

## 是一个标记粘贴运算符,即它应该从多个标记位中生成一个标记,正如编译器所说,::Val 不是一个 token ,它是两个 token 。

为什么你认为你需要第二个##?这有什么问题。

#define TEST(a) TN::Info get ## a () { return TN::a; }

关于c++ - 带有命名空间的 Concat 宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928475/

相关文章:

c - 预处理器指令如何在 C 中工作?

c - 如何在 C 中解析链接的宏?

c - 嵌套 C 宏、CRC 计算、Eclipse Java 崩溃

适用于 Mac 的 C++ IDE

c - C 上的预处理器

c++ - 带有尾随注释的多行预处理器宏

c++ - 无依赖编程

c++ - OpenCV VideoCapture::set iOS 不工作

c++ - 分析和优化编译

c++ - nvcc 致命 : Unsupported gpu architecture 'compute_61' while CUDA 8. 0 已安装