我正在阅读C / C ++中的__FUNCTION__
/ __func__
(它们用于打印使用它们的函数的名称)。我读过的每个地方都说这些都是宏,并在预处理时被替换。因此,我通过使用命令gcc -E prog.c
查看预处理输出来调查此问题。但我看到,__func__
和__FUNCTION__
都没有被预处理器替换为函数名。
那么,它是一个宏吗?如果没有,它是什么以及它是如何实现的?
修改
甚至尝试cpp prog.c
。但仍然没有被替换。
同样__FILE__, __LINE__, and __FUNCTION__ usage in C++这篇文章说它永远不会影响性能。请澄清。
答案 0 :(得分:7)
它们被实现为(并且是)"魔术变量"。 The manual says:
GCC提供三个魔术变量,用于保存当前函数的名称,作为字符串。 第一个是
__func__
,它是C99标准的一部分:标识符
__func__
由翻译者隐式声明,就像立即一样 在每个函数定义的左大括号之后,声明static const char __func__[] = "function-name";
出现,其中
function-name
是词法封闭函数的名称。这个名字 是功能的简单名称。
它们通常无法实现为预处理器宏;预处理器不解析函数范围。当然,可以使预处理器了解足够的语法以了解函数的开始和结束位置,但通常它们不会在该级别上运行。
答案 1 :(得分:6)
__func__
本质上是一个预定义的变量,而不是宏。如果__FUNCTION__
将被展开,__func__
将不会被展开,并且将被用作您在函数中定义以下内容的方式:
static const char __func__[] = "function-name";
或
static const char __func__[] = __FUNCTION__;
请参阅:
__func__
的意图与__FUNCTION__
类似,但交付方式不同。
http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2004/n1642.html