宏中的双哈希(##)是什么意思?

时间:2010-11-19 12:53:35

标签: c++ c

在下面的代码中,##做了什么?

 #define MAKE_TYPE(myname) \
 typedef int myname ## Id; \

2 个答案:

答案 0 :(得分:22)

宏中的##是连接。在此,MAKE_TYPE(test)将扩展为:typedef int testId

从16.3.3(##运算符):

  

对于类似对象和类似函数   宏调用之前   重新检查替换列表   每个要替换的宏名称都要多   ##预处理令牌的实例   在替换列表中(不是来自   删除参数)和前面的   预处理令牌是连接在一起的   使用以下预处理标记

答案 1 :(得分:4)

icecrime是正确的,但在定义中要指出的重要事项是令牌需要是有效的预处理令牌。例子:

#define CONCAT(a,b) a ## b
CONCAT(ClassyClass, <int>); // bad, <int> is not a valid preprocessing token
CONCAT(Symbol, __LINE__); // valid as both are valid tokens