每个源文件展开一次__COUNTER__宏

时间:2013-07-25 14:23:11

标签: c xcode4 llvm c-preprocessor

我正在尝试编写一个宏,它只会为每个源文件扩展一次__COUNTER__宏。我完全理解宏如何与它们的扩展一起工作,但我对这个问题很困难。我想在文件顶部展开一次__COUNTER__宏,然后对该定义的每个引用都不会将__COUNTER__展开到它的下一个数字。

所以我想将__COUNTER__完全展开为单个值,然后在当前工作源文件中始终使用该值。

我只能使用 C 可用的功能。

1 个答案:

答案 0 :(得分:2)

__COUNTER__扩展名(我想你使用的是gcc系列中的编译器)对于这种用途来说太受限制了。困难在于,如果你把它放到另一个宏中,比如说TOTO,它不会在定义时扩展,而只是在它的使用时扩展。因此,TOTO的每次调用都会产生一个新的计数器值。

P99我有一个可移植的替代品,它实现了一些#include hackery的目标。 P99_FILEID是一个每个文件的标识符,P99_LINEID是一个ID,对于编译单元中的所有行应该是唯一的(但要小心使用)。

另一个替代方案,如果你只需要一个编译时常量而且预处理器本身没有任何东西可以在枚举常量中使用计数器。

enum { toto_id = __COUNT__, };