1

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

因此,我想完全扩展__COUNTER__为一个值,然后在当前工作源文件中始终使用该值。

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

4

1 回答 1

2

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

P99中,我有一个便携式替代品,它通过一些黑客技术实现了这个目标#includeP99_FILEID然后是每个文件的标识符,以及P99_LINEID对于编译单元中的所有行应该是唯一的 ID(但要小心使用)。

如果您只需要一个编译时间常数并且预处理器本身没有任何内容,则另一种选择是在枚举常数中使用计数器。

enum { toto_id = __COUNT__, }; 
于 2013-07-25T14:55:07.693 回答