我知道预定义的标识符__func__
使函数名可用于函数内.但我什么时候需要呢?其中一个目的可以是调试.其他用例有哪些?
更新:为了清楚起见,因为在(可移植的)C或C++中,没有什么可以用当前函数的名称作为"字符串"(char
数组),你几乎只限于在某处写字符串 - 这可能都是被视为诊断或"调试"目的.话虽如此,您可能想要为函数名称提供某种用法.例如,声明性安全性,可配置日志记录(尽管再次是"诊断"等).
实际上,Web上的大多数描述和手册都明确提到了__func__
和(__LINE__
以及__FILE__
此类)的实用程序是调试和诊断.
就个人而言,我认为它可以帮助实现"更好"的assert()
输出.
只要您"以编程方式"需要知道当前函数的名称,就可以使用它.这几乎排除了调试器,你可以通过调试器的方式获得当前函数的名称(甚至上下文).
__func__
(或其较旧的非标准前身__FUNCTION__
)通常__LINE__
与可能的__FILE__
宏一起使用,以提供跟踪或诊断输出功能,自动包括当前功能(和文件,行).
#define TRACE(s) \
do { fprintf(stderr, "%s:%d:%s: %s", __FILE__, __LINE__, __func__, (s)); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
int my_func(char* arg1, int arg2)
{
TRACE("Doing stuff...");
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息和示例,请参阅此 Stackoverflow问答.
即使仅用于这样的输出目的,其可用性__func__
也非常有限,因为它仅包括函数的"不合格和简单的名称".这样,对于上面的例子,它只能通过"my_func".
在C/C++中,这意味着对于重载函数,您将无法通过__func__
单独的值来区分它们.如果有的话,也不包括类和/或命名空间名称.
还编译器通常提供非标准变化那些包括完整的函数签名或其他细节(GCC(见__PRETTY_FUNCTION__
),微软C/C++(见__FUNCDNAME__
,__FUNCSIG__
)).