__func__未在预处理输出中替换

tap*_*and 4 c c++ macros

我正在阅读__FUNCTION__/ __func__在C/C++中(它们用于打印使用它们的函数的名称).我读过的每个地方都说这些都是宏,并在预处理时被替换.所以,我通过使用命令查看预处理输出来调查这一点gcc -E prog.c.但是我发现函数名称既__func__没有__FUNCTION__被预处理器替换也没有被替换.

那么,它是一个宏吗?如果没有,它是什么以及如何实施?

编辑

甚至尝试过cpp prog.c.但仍未取代.

此外__FILE__,__LINE__在C++和__FUNCTION__使用这篇文章说,它永远不会影响性能.请澄清.

unw*_*ind 7

它们被实现为(并且是)"魔术变量".手册说:

GCC提供三个魔术变量,用于保存当前函数的名称,作为字符串.第一个是__func__C99标准的一部分:

标识符__func__由翻译器隐式声明,就像紧跟在每个函数定义的左括号之后的声明一样

static const char __func__[] = "function-name";
Run Code Online (Sandbox Code Playgroud)

出现了,function-name词法封闭函数的名称在哪里.此名称是函数的简单名称.

它们通常不能实现为预处理器宏; 预处理器不解析函数范围.当然,可以使预处理器了解足够的语法以了解函数的开始和结束位置,但通常它们不在该级别运行.


biz*_*dee 6

__func__本质上是一个预定义的变量,而不是一个宏.__FUNCTION__将在哪里展开,__func__不会,并将被用作在您的函数中定义以下内容:

static const char __func__[] = "function-name";
Run Code Online (Sandbox Code Playgroud)

要么

static const char __func__[] = __FUNCTION__;
Run Code Online (Sandbox Code Playgroud)

请参阅:

意图__func__类似__FUNCTION__,但交付是不同的.

http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2004/n1642.html