我有一个宏,其中一个参数是一个枚举值,它在没有指定命名空间范围的情况下给出。但是在宏内部的某处我需要访问它(显然我必须在那里定义 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/