有没有人使用过 __COUNTER__ 预处理器宏?

新手上路,请多包涵

__COUNTER__ 符号由 VC++ 和 GCC 提供,每次使用时都会给出一个递增的非负整数值。

我有兴趣了解是否有人使用过它,以及它是否值得标准化?

原文由 dcw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

它用于 xCover 代码覆盖库中,用于标记执行通过的行,以查找未覆盖的行。

原文由 JamieH 发布,翻译遵循 CC BY-SA 3.0 许可协议

__COUNTER__ 可用于建立唯一的局部变量。 __COUNTER__ 的问题在于它的值在每次扩展时都不同。但是我们能做的就是把我们的宏一分为二:

 #define MACRO_IMPL(COUNTER, ARG1, ARG2, ..., ARGN)

#define MACRO(ARG1, ARG2, ..., ARGN) MACRO_IMPL(__COUNTER__, ARG1, ARG2, ... ARGN)

所以现在 MACRO_IMPL 有一个唯一的计数器,通过 COUNTER 参数值,它可以用来生成多次定义和引用的本地符号。例如

#define CAT(A, B) A ## B
#define XCAT(A, B) CAT(A, B)
#define U(COUNTER) XCAT(__U, COUNTER)

#define REPEAT_IMPL(C, N) for (int U(C) = 0; U(C) < (N); U(C)++)

#define REPEAT(N) REPEAT_IMPL(__COUNTER__, N)

REPEAT (42) { puts("Hey!"); REPEAT (73) { puts("Cool!"); } }

通过 gcc -E - 扩展:

 # 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "<stdin>"
# 9 "<stdin>"
    for (int __U0 = 0; __U0 < (42); __U0++) { puts("Hey!"); for (int __U1 = 0; __U1 < (73); __U1++) { puts("Cool!"); } }

我故意将循环放在一行中;在这种情况下,使用 __LINE__ 而不是 __COUNTER__ 可能会中断。

原文由 Kaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题