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.
人们应该区分整个输入的传递次数,这是单次传递通常所指的术语,以及嵌套扩展的处理.预处理器通常会在文件中一次性扩展所有宏,但它会正确扩展展开的表单,直到没有任何内容可以展开.
也就是说,LOG_LINE扩展到log<__LINE__>(),__LINE__再次扩展到3,产生最终的扩展log<3>()- 所有这一切都在一次通过编译单元.