在下面的代码中,##
做了什么?
#define MAKE_TYPE(myname) \
typedef int myname ## Id; \
答案 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