__func__或__FUNCTION__或手动const char*id?

Let*_*_Be 23 c

我想知道它有多广泛__func__(C99的一部分,但我正在编译为C89)并__FUNCTION__得到支持.

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

Kei*_*son 11

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

支持__func__在C99的预编译器将取决于你正在使用的编译器.

现代版本的gcc __func__甚至支持C90模式(-ansi-std=c89).

__func__添加到标准之前,gcc实现了自己的等效扩展,但是带有名称__FUNCTION__.(GCC也支持__PRETTY_FUNCTION__,这是相同的__func__并且__FUNCTION__为C,但在C提供了更多的信息++.)

GCC手册给出了一些建议:

__FUNCTION__是另一个名字__func__.较旧版本的GCC仅识别此名称.但是,它没有标准化.为了获得最大的可移植性,我们建议您使用__func__,但为预处理器提供回退定义:

 #if __STDC_VERSION__ < 199901L
 # if __GNUC__ >= 2
 #  define __func__ __FUNCTION__
 # else
 #  define __func__ "<unknown>"
 # endif
 #endif
Run Code Online (Sandbox Code Playgroud)

这意味着gcc __FUNCTION__在版本2中增加了支持.gcc 2.0 于1992 年发布 ; 你不太可能使用至少不支持的gcc版本__FUNCTION__,如果没有__func__.

请注意,由于__func____FUNCTION__是预定义的标识符,而不是宏,您只需要#define一次,而不是每个函数.另一方面,您无法使用#ifdef __func__#ifdef __FUNCTION__检测支持级别.

至于其他的编译器,一个快速实验表明,微软的Visual C++ 2010 Express支持__FUNCTION__,但没有__func____PRETTY_FUNCTION__,编译C代码时.gcc手册中的上述代码块在MSVC下编译,但结果__func__定义为"<unknown>".调整它以识别MSVC支持不应该太困难__FUNCTION__.(我不知道旧版本是否会这样做.)您可以使用预定义的宏_MSC_VER.微软的文档说支持__FUNCTION__,至少可以追溯到2003年发布,其中规定_MSC_VER1300,因此更改第二行

# if __GNUC >= 2 || _MSC_VER >= 1300
Run Code Online (Sandbox Code Playgroud)

是一个好的开始.(早期版本可能已经支持它.)

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


San*_*ker 7

boost current_function.hpp标头包含几个#defines,用于在不同平台上获取当前函数的方法.

这并不是说那些平台不支持获取当前功能的其他方式,但是对于提升的选择可能代表了在这些平台上获取信息的好方法(如果不是最好的方式).

您的代码(和C)的这个标题的改编可能就是您所需要的.