我想知道__func__
(C99的一部分,但我正在编译为C89)和支持__FUNCTION__
的范围有多广。
我有一个旧代码库,主要使用手动const char* id;
变量,然后传递给各种(主要是日志记录)函数。我想摆脱这个并将函数名称移动到一个宏。
答案 0 :(得分:10)
预定义标识符__func__
已添加到1999 ISO C标准中;较旧的1990 C标准没有它。
在C99之前的编译器中对__func__
的支持将取决于您使用的编译器。
现代版gcc即使在C90模式下也支持__func__
(-ansi
或-std=c89
)。
在__func__
添加到标准之前,gcc实现了自己的等效扩展,但名称为__FUNCTION__
。 (gcc也支持__PRETTY_FUNCTION__
,它与C的__func__
和__FUNCTION__
相同,但在C ++中提供了更多信息。)
gcc manual给出了一些建议:
__FUNCTION__
是__func__
的另一个名称。较旧版本的GCC仅识别此名称。但是,它没有标准化。最大化 可移植性,我们建议您使用__func__
,但提供后备 预处理器的定义:
#if __STDC_VERSION__ < 199901L
# if __GNUC__ >= 2
# define __func__ __FUNCTION__
# else
# define __func__ "<unknown>"
# endif
#endif
这意味着gcc在版本2中添加了对__FUNCTION__
的支持。在1992年,gcc 2.0 was released;你不太可能使用至少不支持__FUNCTION__
的gcc版本,如果不是__func__
。
请注意,由于__func__
和__FUNCTION__
是预定义的标识符,而不是宏,因此您只需要#define
一次,而不是每个函数。另一方面,您无法使用#ifdef __func__
或#ifdef __FUNCTION__
来检测支持级别。
对于其他编译器,快速实验表明Microsoft Visual C ++ 2010 Express在编译C代码时支持__FUNCTION__
,但不支持__func__
或__PRETTY_FUNCTION__
。上面的gcc手册中的代码块在MSVC下编译,但它导致__func__
被定义为"<unknown>"
。调整它以识别MSVC支持__FUNCTION__
应该不会太难。 (我不知道旧版本是否会这样做。)您可以使用预定义的宏_MSC_VER
。 Microsoft's documentation表示对__FUNCTION__
的支持至少可以追溯到2003年版本,该版本将_MSC_VER
设置为1300
,因此将第二行更改为
# if __GNUC >= 2 || _MSC_VER >= 1300
是一个好的开始。 (它可能在早期版本中得到了支持。)
对于gcc和MSVC以外的编译器,你必须查阅他们各自的文档 - 但无论如何,gcc手册中推荐的代码块应该适用于任何编译器,最坏的情况是回到{{1 }}
答案 1 :(得分:6)
boost current_function.hpp标头包含几个#define
s,用于在不同平台上获取当前函数的方法。
这并不是说这些平台不支持获取当前功能的其他方式,但是为提升做出的选择可能代表了在这些平台上获取信息的好方法(如果不是最好的方式)。 p>
您的代码(以及C)的此标题的改编可能就是您所需要的。
答案 2 :(得分:0)
我相信无论使用什么C标准(如果是C89或C99)。更重要的因素是使用编译器,因为它是将实现__func__
的编译器。无论使用何种标准,最新的GCC编译器都会添加__func__
。我认为。 :)