宏中的双哈希(##)是什么意思?
在下面的代码中, ##
做了什么?
#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