在预处理阶段,__LINE__扩展了哪一点?

Vio*_*ffe 4 c++ c-preprocessor

我在头文件中有一个函数:

template <int line>
inline void log() {}
Run Code Online (Sandbox Code Playgroud)

然后我尝试这个技巧,使它更容易使用:

#define LOG_LINE log<__LINE__>()

然后在.cpp文件中我做:

void main()
{
    LOG_LINE;
}
Run Code Online (Sandbox Code Playgroud)

似乎它按照我喜欢的方式工作.我从.cpp文件获取行,而不是LOG_LINE在.h文件中声明的行.但我不明白它是如何工作的.C++是否会通过双重预处理,留下特殊的宏,如__LINE__第二遍?这是便携式(标准)行为吗?我是否应该期望这适用于所有主要的C++编译器?到目前为止我只尝试过MSVC.

use*_*342 5

人们应该区分整个输入的传递次数,这是单次传递通常所指的术语,以及嵌套扩展的处理.预处理器通常会在文件中一次性扩展所有宏,但它会正确扩展展开的表单,直到没有任何内容可以展开.

也就是说,LOG_LINE扩展到log<__LINE__>(),__LINE__再次扩展到3,产生最终的扩展log<3>()- 所有这一切都在一次通过编译单元.