我正在尝试编写一个宏,它只会为每个源文件扩展一次__COUNTER__
宏。我完全理解宏如何与它们的扩展一起工作,但我对这个问题很困难。我想在文件顶部展开一次__COUNTER__
宏,然后对该定义的每个引用都不会将__COUNTER__
展开到它的下一个数字。
所以我想将__COUNTER__
完全展开为单个值,然后在当前工作源文件中始终使用该值。
我只能使用 C 可用的功能。
答案 0 :(得分:2)
__COUNTER__
扩展名(我想你使用的是gcc系列中的编译器)对于这种用途来说太受限制了。困难在于,如果你把它放到另一个宏中,比如说TOTO
,它不会在定义时扩展,而只是在它的使用时扩展。因此,TOTO
的每次调用都会产生一个新的计数器值。
在P99我有一个可移植的替代品,它实现了一些#include
hackery的目标。 P99_FILEID
是一个每个文件的标识符,P99_LINEID
是一个ID,对于编译单元中的所有行应该是唯一的(但要小心使用)。
另一个替代方案,如果你只需要一个编译时常量而且预处理器本身没有任何东西可以在枚举常量中使用计数器。
enum { toto_id = __COUNT__, };