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

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

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

宏中的##是串联。 这里, MAKE_TYPE(test)将扩展为: typedef int testId

从16.3.3(##运算符):

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

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

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