我正在尝试编写一个宏,该宏将__COUNTER__
每个源文件仅扩展一次宏。我完全理解宏如何与它们的扩展一起工作,但我在这个方面遇到了困难。我想__COUNTER__
在文件顶部展开宏一次,然后对该定义的每个引用都不会扩展__COUNTER__
到它的下一个数字。
因此,我想完全扩展__COUNTER__
为一个值,然后在当前工作源文件中始终使用该值。
我只能使用C可用的功能。
我正在尝试编写一个宏,该宏将__COUNTER__
每个源文件仅扩展一次宏。我完全理解宏如何与它们的扩展一起工作,但我在这个方面遇到了困难。我想__COUNTER__
在文件顶部展开宏一次,然后对该定义的每个引用都不会扩展__COUNTER__
到它的下一个数字。
因此,我想完全扩展__COUNTER__
为一个值,然后在当前工作源文件中始终使用该值。
我只能使用C可用的功能。
扩展(我想你使用的__COUNTER__
是 gcc 系列的编译器)对于这种用途来说太受限制了。困难在于,如果将它放入另一个宏中,例如TOTO
,它不会在定义时扩展,而只是在使用时扩展。所以每次调用TOTO
都会产生一个新的计数器值。
在P99中,我有一个便携式替代品,它通过一些黑客技术实现了这个目标#include
。P99_FILEID
然后是每个文件的标识符,以及P99_LINEID
对于编译单元中的所有行应该是唯一的 ID(但要小心使用)。
如果您只需要一个编译时间常数并且预处理器本身没有任何内容,则另一种选择是在枚举常数中使用计数器。
enum { toto_id = __COUNT__, };