__func__或__FUNCTION__或手动const char * id?

时间:2011-08-10 09:20:56

标签: c

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

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

3 个答案:

答案 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_VERMicrosoft'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__。我认为。 :)