如何在C++预处理器中检测g++和MinGW?

55

我想做类似这样的事情:

#ifdef GCC
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__;
#endif

由于我想使用__PRETTY_FUNCTION__,据我所知,这只有GNU支持,因此我需要检测是否正在为g++和MinGW编译,我该怎么做? 我猜我只需要知道编译器的预处理器定义,就像我在下面为Microsoft所做的那样:

#ifdef WIN32
#define LogFuncBegin() gLogger.FuncBegin( __FUNCTION__ );
#define LogFuncEndSuccess() gLogger.FuncEndSuccess( __FUNCTION__ );
#endif

在C++预处理器中,我如何检测g++和MinGW?

2个回答

67
您可以使用以下内容:
#ifdef __GNUC__
#ifdef __MINGW32__

如果您需要其他宏,您可能会对此页面感兴趣,该页面显示了其他编译器宏。


你的测试用例包括MinGW-64吗? - jww
@jww 不过MinGW-64也会定义32宏,所以这对于那个也可以工作。 - Floris Velleman
5
那个编译器宏列表的更现代版本可以在Sourceforge上的“预定义编译器宏项目”中找到。 - rakslice
1
“this page”的链接已经失效。” - Aaron Franke
或者使用__GNUG__,它等同于(__GNUC__ && __cplusplus),如果你想区分C++和C。 - Alex Che
链接页面的Wayback Machine存档版本:https://web.archive.org/web/20160308010351/https://beefchunk.com/documentation/lang/c/pre-defined-c/precomp.html - 尽管我同意@rakslice的观点,认为类似https://github.com/cpredef/predef的更新列表更可取。 - AJM

48

对于GCC:

#ifdef __GNUC__

对于MinGW:

#ifdef __MINGW32__

x86_64-w64-mingw32-gcc 定义了__MINGW32____MINGW64__ 两个标识符。


2
你的测试用例包括MinGW-64吗? - jww
2
这个答案是在MinGW-64之前写的。但我认为它也定义了__MINGW32__宏。所以应该仍然有效。 - sedavidw
这有点无意义。我找不到项目提供的MinGW-64.... 解决不存在的问题是没有意义的.... - jww
10
MinGW-w64是MinGW的一个硬分支,因为MinGW表现不够出色。如今几乎所有人都使用MinGW-w64而不是原始的MinGW。MSYS2和MSYS也是如此。 - Alex Huszagh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接