C 对每个源文件展开一次_计数器_宏

C 对每个源文件展开一次_计数器_宏,c,xcode4,llvm,c-preprocessor,C,Xcode4,Llvm,C Preprocessor,我正在尝试编写一个宏,该宏将在每个源文件中仅扩展一次\uuuu计数器\uuuu宏。我完全理解宏如何与它们的扩展一起工作,但我对这个有困难。我想在文件的顶部展开一次\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu计数器宏,然后对该定义的每个引用都不会将\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 因此,我想将\uuuu COUNTER\uuuu完全扩展为单个值,然后在当前工作源文件中一致地使用该值 我只能使用C可用的功能\uu

我正在尝试编写一个宏,该宏将在每个源文件中仅扩展一次
\uuuu计数器\uuuu
宏。我完全理解宏如何与它们的扩展一起工作,但我对这个有困难。我想在文件的顶部展开一次
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu计数器
宏,然后对该定义的每个引用都不会将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

因此,我想将
\uuuu COUNTER\uuuu
完全扩展为单个值,然后在当前工作源文件中一致地使用该值


我只能使用C

可用的功能
\uuuu计数器\uuuuu
扩展(我想您使用的是gcc系列的编译器)对于这种使用来说太有限了。困难在于,如果将它放入另一个宏中,比如说
TOTO
,它不会在定义时展开,而只能在使用时展开。因此每次调用
TOTO
都会产生一个新的计数器值

在这方面,我有一个便携式的替代品,它通过一些
#包括
黑客技术来实现这一目标
P99_FILEID
是每个文件的标识符,
P99_LINEID
是编译单元中所有行都应该唯一的ID(但请小心使用)

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

enum { toto_id = __COUNT__, }; 

模板元编程,您可以在…编译时“生成”运行代码的ID。我仅限于使用C,因此此解决方案必须在预处理程序上。值是否需要在编译时可用?或者它可以等到运行时吗?必须是编译时。这看起来非常像我需要的,我可以在哪里下载你的P99,在哪里可以看到它的许可证?@FelixJones,所有这些都可以通过主页P99.gforge.inria.fr找到。许可证是QPL,但有望很快改为GPL。似乎不起作用,每个文件都有编号1111。我猜这是因为宏没有保留在源输入之间,我必须看看是否可以将其设置为编译器的全局定义文档中说“标识文件包含不同时间的id”p99_id.h“因此,您必须在每个头文件和.c文件中包含该文件才能更新计数器。啊,恐怕不会发生这种情况。我只需要在我的软件中设置一个容易出错的部分