将__COUNTER__宏重置为零

use*_*425 3 c++

是否可以__COUNTER__在头文件的开头重置宏,以使其在头文件中的评估在几个编译单元上保持一致?

MSa*_*ers 6

您可以将其设置BASE__COUNTER__头文件的顶部,然后再使用__COUNTER__ - BASE.

但是,在包含所有必需的标头之后执行此操作,因为否则结果将取决于在__COUNTER__ 这些嵌套包含文件的标头保护中的使用.


Mic*_*ael 6

枚举怎么样?

enum { COUNTER_BASE = __COUNTER__ };

#define LOCAL_COUNTER (__COUNTER__ - COUNTER_BASE)
Run Code Online (Sandbox Code Playgroud)

  • 这很完美,很简单,但完全被每个人忽视了!这应该是公认的答案,毫无疑问! (2认同)

rod*_*igo 4

不,没有办法重置该值。

看一下增加计数器的GCC 源代码:

case BT_COUNTER:
    if (CPP_OPTION (pfile, directives_only) && pfile->state.in_directive)
    cpp_error (pfile, CPP_DL_ERROR,
        "__COUNTER__ expanded inside directive with -fdirectives-only");
    number = pfile->counter++;
    break;
Run Code Online (Sandbox Code Playgroud)

如果你环顾这个库,你会发现没有任何地方被counter再次修改。它默认初始化为0,然后在每次使用时递增。

请注意pfile,变量counter所在的 代表预处理器输入,在本例中是当前编译单元,而不是实际文件。