__COUNTER__
符号由 VC++ 和 GCC 提供,每次使用时都会给出一个递增的非负整数值。
我有兴趣了解是否有人使用过它,以及它是否值得标准化?
原文由 dcw 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
它用于 xCover 代码覆盖库中,用于标记执行通过的行,以查找未覆盖的行。