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

C++ 宏中的双哈希(##)是什么意思?,c++,c,C++,C,在下面的代码中,##的作用是什么 #define MAKE_TYPE(myname) \ typedef int myname ## Id; \ 宏中的##是串联。这里,MAKE_TYPE(test)将扩展到:typedef int testId 从第16.3.3节(操作员): 对于类对象和类函数 宏调用,在 重新检查替换列表是否存在错误 要替换的宏名称更多,每个 ##预处理令牌的实例 在替换列表中(不是从 参数)并删除前面的 将预处理令牌连接起来 使用以下预处理令牌 icecrime是正

在下面的代码中,
##
的作用是什么

 #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, <int>); // bad, <int> is not a valid preprocessing token
CONCAT(Symbol, __LINE__); // valid as both are valid tokens
#定义CONCAT(a,b)a##b
CONCAT(ClassyClass,);//错误,不是有效的预处理令牌
CONCAT(符号,uuu线uuu);//有效,因为两者都是有效的令牌

在重新检查替换列表之前,我会在下面划线。如果您编写
MAKE_TYPE(OBJECT(Foo))
则您将拥有
typedef int OBJECT(Foo)Id。。。这显然是无效的。处理宏是。。。复杂,最好避免,尤其是对于那些只会混淆事物的琐碎情况。几年前,这让我非常沮丧,因为我想将三个事物连接在一起,并且第一对和最后一对的组合都不是有效的预处理标记。很有意义,但不是答案。应该是icecrime的评论,本质上是