在C,C++中使用__func__标识符的用例?

aks*_*hay -1 c c++

我知道预定义的标识符__func__使函数名可用于函数内.但我什么时候需要呢?其中一个目的可以是调试.其他用例有哪些?

Chr*_*n.K 7

更新:为了清楚起见,因为在(可移植的)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__)).