gpt4 book ai didi

c - __func__ 或 __FUNCTION__ 或手动 const char* id?

转载 作者:太空狗 更新时间:2023-10-29 16:26:10 28 4
gpt4 key购买 nike

我想知道 __func__(C99 的一部分,但我编译为 C89)和 __FUNCTION__ 的支持范围有多广。

我有一个旧代码库,主要使用手动 const char* id; 变量,然后传递给各种(主要是日志记录)函数。我想去掉这个并将函数名称移到宏中。

最佳答案

预定义标识符__func__被添加到 1999 ISO C 标准中;较旧的 1990 C 标准没有它。

支持__func__在 C99 之前的编译器中将取决于您使用的编译器。

现代版本的 gcc 支持 __func__即使在 C90 模式下( -ansi-std=c89 )。

之前__func__被添加到标准中,gcc 实现了自己的等效扩展,但名称为 __FUNCTION__ . (gcc 还支持 __PRETTY_FUNCTION__,这与 C 的 __func____FUNCTION__ 相同,但在 C++ 中提供了更多信息。)

gcc manual给出一些建议:

__FUNCTION__ is another name for __func__. Older versions of GCC recognize only this name. However, it is not standardized. For maximum portability, we recommend you use __func__, but provide a fallback definition with the preprocessor:

 #if __STDC_VERSION__ < 199901L
# if __GNUC__ >= 2
# define __func__ __FUNCTION__
# else
# define __func__ "<unknown>"
# endif
#endif

这意味着 gcc 添加了对 __FUNCTION__ 的支持在版本 2.gcc 2.0 was released 1992年;您不太可能使用至少不支持 __FUNCTION__ 的 gcc 版本, 如果不是 __func__ .

注意自 __func____FUNCTION__是预定义标识符,不是宏,您只需要 #define一次,而不是在每个函数中。另一方面,您不能使用 #ifdef __func__#ifdef __FUNCTION__检测支持水平。

至于其他编译器,快速实验表明 Microsoft Visual C++ 2010 Express 支持 __FUNCTION__ , 但不是 __func____PRETTY_FUNCTION__ , 在编译 C 代码时。 gcc 手册中的上述代码块在 MSVC 下编译,但结果为 __func__被定义为 "<unknown>" .调整它以识别 MSVC 支持 __FUNCTION__ 应该不会太难。 . (我不知道旧版本是否这样做。)您可能可以使用预定义的宏 _MSC_VER为了这。 Microsoft's documentation表示支持 __FUNCTION__至少可以追溯到 2003 年的版本,它设置了 _MSC_VER1300 , 所以把第二行改成

# if __GNUC >= 2 || _MSC_VER >= 1300

是一个好的开始。 (它很可能在早期版本中得到支持。)

对于 gcc 和 MSVC 以外的编译器,您必须查阅它们各自的文档——但无论如何,gcc 手册中推荐的代码块应该适用于任何编译器,最坏情况下回退到 "<unknown>" .

关于c - __func__ 或 __FUNCTION__ 或手动 const char* id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7008485/

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