我发现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预处理器评估宏的方式有关。 (但是,由于我甚至认为这个例子没有效果,我对宏如何工作的直觉显然已经过时了。)
答案 0 :(得分:12)
为什么如果在文件中声明JOIN后,LINE_NAME宏甚至可以工作?
宏不是函数,当你调用它们时,编译器会扩展它们,并且使用点上的编译器知道所有已定义的宏。
为什么有必要同时使用JOIN和_DO_JOIN宏来获得正确的结果?在宏中具有这种间接级别似乎很奇怪。
因为__LINE__
本身就是一个宏,所以它需要两个级别的扩展。
否则输出不是prefix1234
,而是prefix__LINE__
。
阅读this answer和this thread也很有用。