__func__
在 C99 中被定义(但不在 C++ 中),gcc 已经提供了 __FUNCTION__
和 __PRETTY_FUNCTION__
很长时间了。然而,它们都不是宏,因此不能像宏一样使用。这意味着你不能使用 #ifdef
来测试它们。
要测试是否编译为 C++,以及使用的标准是什么,请使用在 C++ 标准中指定的 __cplusplus
,它会扩展为值 199711L
(C++11 之前)、201103L
(C++11)、201402L
(C++14)和 201703L
(C++17)。这些值对应于标准化委员会批准标准的日期(年份和月份)(例如,201703L
表示 C++17 在 2017 年 3 月获得批准)。请注意,只有在编译 C++ 时才定义此宏。
此外,要使用特定于编译器的功能,需要测试支持所需功能的编译器,而不是测试功能本身(尽管某些编译器/预处理器允许测试特定的语言功能,但实际上这种情况并不普遍)。
gcc和g++(以及其他声称支持GNU C方言的编译器)提供许多特定的宏,因此您可以检查它们,包括:
__GNUC__
- 定义为GNU C编译器(可以使用#ifdef
进行测试)。对于gcc版本x.y.z
,__GNUC__
扩展为值x
;
__GNUC_MINOR__
- 定义为GNU C编译器(可以使用#ifdef
进行测试)。对于gcc版本x.y.z
,__GNUC_MINOR__
扩展为值y
;
__GNUC_PATCH_LEVEL__
- 定义为GNU C编译器(可以使用#ifdef
进行测试)。对于gcc版本x.y.z
,__GNUC_PATCHLEVEL__
扩展为值z
;
__GNUG__
- 定义为g++编译器。
以下是如何使用GNU特定宏的示例:
#ifdef __GNUG__
/* Assume all versions of gcc that you use support __FUNCTION__ */
/* can use gcc's __FUNCTION__ here */
#endif
我不知道从哪个g++版本开始支持__FUNCTION__
和__PRETTY_FUNCTION__
,但如果你想测试编译器的特定版本,这很容易。例如,要测试g++ 3.2.0或更高版本:
#ifdef __GNUG__
#if __GNUC__ > 3 || \
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
(__GNUC_MINOR__ == 2 && \
__GNUC_PATCHLEVEL__ > 0))
#endif
#endif
对于MSVC++,编译器特定的宏用于类似的目的,包括
_MSC_VER
,它扩展为主要和次要版本的编码。例如,在MSVC++版本17.00.51106.1下,
_MSC_VER
扩展为1700。您可以在MSDN上找到其他信息。
[dcl.fct.def.general]
部分,“函数本地预定义变量__func__
定义为…” (我加重了语气)。 - Some programmer dude