__func__ 未在预处理输出中替换
__func__ not replaced in preprocessed output
我在 C/C++ 中阅读了有关 __FUNCTION__
/ __func__
的内容(它们用于打印使用它们的函数的名称)。我读到的每个地方都说这些是宏,在预处理时被替换。因此,我通过使用命令 gcc -E prog.c
查看预处理的输出来对此进行调查。但是我看到 __func__
和 __FUNCTION__
都没有被预处理器替换为函数名
那么,它是一个宏吗?如果不是,它是什么以及它是如何实现的?
编辑
甚至尝试过cpp prog.c
。但是还是没换。
另外 __FILE__, __LINE__, and __FUNCTION__ usage in C++ 这个 post 说它从不影响性能。请澄清。
__func__
本质上是一个预定义的变量,而不是宏。其中 __FUNCTION__
将被扩展,而 __func__
不会,并且将被使用,就好像您在函数中定义了以下内容:
static const char __func__[] = "function-name";
或
static const char __func__[] = __FUNCTION__;
请参考:
The intent of __func__
is similar to __FUNCTION__
, but the delivery is different.
http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2004/n1642.html
它们被实现为(并且是)"magic variables"。 The manual says:
GCC provides three magic variables that hold the name of the current function, as a string.
The first of these is __func__
, which is part of the C99 standard:
The identifier __func__
is implicitly declared by the translator as if, immediately
following the opening brace of each function definition, the declaration
static const char __func__[] = "function-name";
appeared, where function-name
is the name of the lexically-enclosing function. This name
is the unadorned name of the function.
它们通常不能作为预处理器宏实现;预处理器不解析函数作用域。当然,预处理器 可以 理解足够的语法以了解函数的开始和结束位置,但通常它们不在该级别运行。
我在 C/C++ 中阅读了有关 __FUNCTION__
/ __func__
的内容(它们用于打印使用它们的函数的名称)。我读到的每个地方都说这些是宏,在预处理时被替换。因此,我通过使用命令 gcc -E prog.c
查看预处理的输出来对此进行调查。但是我看到 __func__
和 __FUNCTION__
都没有被预处理器替换为函数名
那么,它是一个宏吗?如果不是,它是什么以及它是如何实现的?
编辑
甚至尝试过cpp prog.c
。但是还是没换。
另外 __FILE__, __LINE__, and __FUNCTION__ usage in C++ 这个 post 说它从不影响性能。请澄清。
__func__
本质上是一个预定义的变量,而不是宏。其中 __FUNCTION__
将被扩展,而 __func__
不会,并且将被使用,就好像您在函数中定义了以下内容:
static const char __func__[] = "function-name";
或
static const char __func__[] = __FUNCTION__;
请参考:
The intent of
__func__
is similar to__FUNCTION__
, but the delivery is different.
http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2004/n1642.html
它们被实现为(并且是)"magic variables"。 The manual says:
GCC provides three magic variables that hold the name of the current function, as a string. The first of these is
__func__
, which is part of the C99 standard:The identifier
__func__
is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declarationstatic const char __func__[] = "function-name";
appeared, where
function-name
is the name of the lexically-enclosing function. This name is the unadorned name of the function.
它们通常不能作为预处理器宏实现;预处理器不解析函数作用域。当然,预处理器 可以 理解足够的语法以了解函数的开始和结束位置,但通常它们不在该级别运行。