回答
宏中的##
是串联。在这里,MAKE_TYPE(test)
将扩展为:typedef int testId
。
从16.3.3(##的操作者):
对于这两种样函数对象样和 宏调用,进行复核之前 替换列表为 多个宏名称来替换,每个一个##在替换列表(从 参数不)预处理记号 被删除,并且前述 预处理标记的 实例级联 具有以下预处理记号
我要强调前的*替换列表被重新检查*。如果你写'MAKE_TYPE(OBJECT(Foo))',那么你将有'typedef int OBJECT(Foo)Id;'......这显然是无效的。处理宏是复杂的,并且最好避免,尤其是对于只会混淆事物的这种微不足道的情况。 – 2010-11-19 15:22:45
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
几年前,这让我感到非常沮丧,因为我想将三件事合并在一起,而第一对和最后一对的组合都不是有效的预处理标记。 – 2010-11-19 18:04:16
伟大的一点,但不是一个答案。应该是对icecrime的评论。 – 2016-07-29 15:59:47
- 1. “散货”是什么意思?
- 2. '散列缺点'是什么意思?
- 3. Bash'type someCmd':什么意思是'散列'?
- 4. 什么是双重?在C#中是什么意思?
- 5. c。宏中的`.`和`*`是什么意思?
- 6. C宏中的#x是什么意思?
- 7. 宏中的__VA_ARGS__是什么意思?
- 8. 这是什么意思#value在宏中
- 9. 是什么意思:是什么意思?
- 10. 散列中的聚集(在碰撞中)是什么意思?
- 11. 重点是什么意思?
- 12. “重构”是什么意思?
- 13. 这个C宏是什么意思?
- 14. 这个宏函数是什么意思?
- 15. 宏_bnd(X,bnd)是什么意思?
- 16. 这个C宏是什么意思?
- 17. JavaScript中的双重百分比符号(%%)是什么意思?
- 18. 双腿认证是什么意思?
- 19. 双括号是什么意思?
- 20. WinDbg中的“重叠”是什么意思?
- 21. 散列time_t的字节是什么意思?
- 22. “散列函数的分布”是什么意思?
- 23. 什么是 “范围(” F:F “)” 在Excel宏是什么意思?
- 24. 是什么意思,在Python中是什么意思?
- 25. .js文件后散列(#)是什么意思?
- 26. 什么意思是“x位散列函数”
- 27. 散列函数增量是什么意思?
- 28. Ruby on Rails这个散列输出是什么意思?
- 29. 双重不存在子句是什么意思?
- 30. SURF的min_dist和max_dist是什么意思,FlannMatcher是什么意思
本质[SO 1489932 C预处理和串联](http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/)的副本 – 2010-11-20 03:00:38