Tag: concat

为什么这个连接宏需要一个间接级别?

我找到了一篇有趣的小博文 ,解释了如何使用行号在宏中生成(半)唯一名称: // 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 这里有两件事让我很困惑: 为什么如果在文件中声明JOIN后, LINE_NAME宏甚至可以工作? 我认为C预处理器进行了线性传递,因此需要根据依赖性来定义宏,就像C函数在使用之前需要定义一样。 为什么有必要同时使用JOIN和_DO_JOIN宏来获得正确的结果? 在宏中具有这种间接级别似乎很奇怪。 我有一种感觉,这两个问题的答案是相关的,并且与C预处理器评估宏的方式有关。 (但是,由于我甚至认为这个例子无效,我对宏如何工作的直觉显然已经过时了。)