【发布时间】:2013-11-09 01:48:52
【问题描述】:
我发现 an interesting little blog post 解释了如何使用行号在宏中生成(半)唯一名称:
// Do magic! Creates a unique name using the line number
#define LINE_NAME( prefix ) JOIN( prefix, __LINE__ )
#define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 )
#define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2
这里有两件事让我很困惑:
- 为什么
LINE_NAME宏即使在文件中声明了JOIN之后也能工作?我认为 C 预处理器进行了线性传递,因此需要根据依赖关系定义宏,就像在使用 C 函数之前需要定义它们一样。 - 为什么必须同时使用
JOIN和_DO_JOIN宏才能获得正确的结果?在宏中使用这种间接级别似乎很奇怪。
我感觉这两个问题的答案是相关的,并且与 C 预处理器评估宏的方式有关。 (但是,我对宏如何工作的直觉显然是错误的,因为我什至不认为这个例子是有效的。)
【问题讨论】: