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的评论,本质上是