gpt4 book ai didi

c++ - C、C++ 中 __func__ 标识符的用例?

转载 作者:行者123 更新时间:2023-11-30 18:17:39 24 4
gpt4 key购买 nike

据我了解,预定义标识符 __func__ 使函数名称可在函数内使用。但我什么时候需要它?目的之一是用于调试。其他用例是什么?

最佳答案

更新:为了清楚起见,由于在(可移植)C 或 C++ 中,您无法将当前函数的名称作为“字符串”( char 数组)执行任何操作,因此您可以几乎仅限于在某处写入该字符串 - 这都可以被视为诊断或“调试”目的。话虽如此,您可能想要想出函数名称的某种用法。例如,声明性安全性、可配置日志记录(尽管又是“诊断”等)。

事实上,网络上的大多数描述和手册都明确提到 __func__ 的实用性和(__LINE____FILE__ 就此而言)是调试和诊断。

我个人认为它是为了帮助“更好”而提供的assert()可能的输出。

<小时/>

每当你“以编程方式”需要知道当前函数的名称时,你就可以使用它。这几乎排除调试器,您可以通过已经可用的调试器获得当前函数的名称(甚至上下文)。

__func__ (或其较旧的非标准前身 __FUNCTION__ )通常与 __LINE__ 一起使用也许__FILE__宏提供跟踪或诊断输出功能,自动包含当前函数(和文件、行)。

#define TRACE(s) \
do { fprintf(stderr, "%s:%d:%s: %s", __FILE__, __LINE__, __func__, (s)); \
} while (0)

然后您可以像这样使用它:

int my_func(char* arg1, int arg2)
{
TRACE("Doing stuff...");

/* ... */
}

有关更多信息和示例,请参阅 this Stackoverflow 问答。

即使对于这种仅输出的目的, __func__ 的可用性非常有限,因为它只包含函数的“不合格且未经修饰的名称”。对于上面的例子来说,它只能通过“my_func”来实现。

在 C/C++ 中,这意味着对于重载函数,您将无法通过 __func__ 的值来区分它们。独自的。类和/或命名空间名称(如果有)也不包括在内。

此外,编译器通常会提供非标准变体,其中包含完整的函数签名或其他详细信息( GCC (请参阅 __PRETTY_FUNCTION__ )、 Microsoft C/C++ (请参阅 __FUNCDNAME____FUNCSIG__ ))。

关于c++ - C、C++ 中 __func__ 标识符的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16784385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com