__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.

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