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

Ven*_*ta 12 c c++

在下面的代码中,该##怎么办?

 #define MAKE_TYPE(myname) \
 typedef int myname ## Id; \
Run Code Online (Sandbox Code Playgroud)

ice*_*ime 22

##在宏是串联.在这里,MAKE_TYPE(test)将扩展到:typedef int testId.

从16.3.3(##运算符):

对于这两种对象类和函数宏调用,进行复核更多宏名称来替换替换列表之前,在替换列表(而不是从一个参数)一个##预处理标记的每个实例被删除,并且前述预处理标记与以下预处理标记连接

  • 在重新检查替换列表之前,我会强调*.如果你写'MAKE_TYPE(OBJECT(Foo))`那么你将有`typedef int OBJECT(Foo)Id;`...这显然是无效的.处理宏是......复杂的,最好避免使用它只会混淆事物的琐碎案例. (4认同)

tyr*_*731 5

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
Run Code Online (Sandbox Code Playgroud)