c - 每个源文件展开一次 __COUNTER__ 宏

标签 c xcode4 llvm c-preprocessor

我正在尝试编写一个宏,它将每个源文件仅扩展一次 __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/

相关文章:

c - 传递 char* 作为参数会破坏程序,而 char[] 不会

c - 不使用索引的指针和数组

objective-c - 将 HTML 内容设置为 MFMailComposeViewController View 的邮件正文

cmake - 无法解析 : "cl.exe" is not able to compile a simple test program

c++ - 链接@_Znam 和@_Znwm

c - x86-64 在寄存器中传递参数的顺序

c - 哪些 DSP 滤波器算法易于实现?

xcode - iOS Xcode 4 属性访问

sql - Xcode 4 和核心数据 : How to enable SQL Debugging

c++ - llvm 5.0 与 llvm::Module::dump() 的链接错误