bbb*_*bbb 8 c++ compiler-construction string g++ c-preprocessor
任何人都可以告诉g ++何时__FUNCTION__用包含函数名称的字符串替换'macro'?它似乎可以替换它,直到它检查源代码的语法正确性,即以下将不起作用
#include <whatsneeded>
#define DBG_WHEREAMI __FUNCTION__ __FILE__ __LINE__
int main(int argc, char* argv)
{
printf(DBG_WHEREAMI "\n"); //*
}
Run Code Online (Sandbox Code Playgroud)
因为经过预处理后使用
g++ -E test.cc
Run Code Online (Sandbox Code Playgroud)
来源看起来像
[...]
int main(int argc, char* argv)
{
printf(__FUNCTION__ "test.cc" "6" "\n"); //*
}
Run Code Online (Sandbox Code Playgroud)
现在编译器正确抛出,因为*ed行不正确.
有没有办法强制用字符串替换前一步,以便该行正确?
难道__FUNCTION__真的毕竟是一个字符串替换?或者它是编译代码中的变量?
Dan*_*ing 15
有没有办法强制用字符串替换前一步,以便该行正确?
编号__FUNCTION__(及其标准化版本__func__)是编译器构造.__FILE__而__LINE__另一方面,是预处理器构造.有没有办法让__FUNCTION__一个预处理器结构,因为预编译器有没有C++语言的知识.当对源文件进行预处理时,预处理器完全不知道它正在查看哪个函数,因为它甚至没有函数的概念.
另一方面,预处理器确实知道它正在处理哪个文件,并且它也知道它正在查看的文件的哪一行,因此它能够处理__FILE__和__LINE__.
这就是__func__定义为等效于静态局部变量(即编译器构造)的原因; 只有编译器才能提供此功能.