我正在尝试编写一个宏,它将每个源文件仅扩展一次 __COUNTER__
宏。我完全理解宏是如何处理它们的扩展的,但我在这个方面遇到了困难。我想在文件顶部扩展一次 __COUNTER__
宏,然后对该定义的每个引用都不会将 __COUNTER__
扩展到它的下一个数字。
所以我想将 __COUNTER__
完全扩展为一个值,然后在当前工作源文件中一致地使用该值。
我只能使用 C 可用的功能。
最佳答案
__COUNTER__
扩展(我假设您使用的是 gcc 系列的编译器)对于这样的用途来说太受限制了。困难在于,如果将它放入另一个宏中,比如 TOTO
,它不会在定义时展开,而只会在使用时展开。因此每次调用 TOTO
都会产生一个新的计数器值。
在P99我有一个可移植替代品,它通过一些 #include
黑客技术实现了这个目标。 P99_FILEID
是每个文件的标识符,P99_LINEID
是编译单元中所有行应该唯一的 ID(但要小心使用)。
如果您只需要一个编译时常量而预处理器本身没有任何内容,则另一种选择是在枚举常量中使用计数器。
enum { toto_id = __COUNT__, };
关于c - 每个源文件展开一次 __COUNTER__ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17860759/