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

Posted

技术标签:

【中文标题】如何在 C++ 预处理器中检测 g++ 和 MinGW?【英文标题】:How can I detect g++ and MinGW in C++ preprocessor? 【发布时间】:2013-07-03 20:16:19 【问题描述】:

我想做这样的事情:

#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

【问题讨论】:

【参考方案1】:

您可以使用:

#ifdef __GNUC__
#ifdef __MINGW32__

对于其他宏,您可能对 this page 感兴趣,它显示了其他编译​​器宏

【讨论】:

您的测试用例是否包含 MinGW-64? @jww 不,但 MinGW-64 也会定义 32 宏,所以这也适用。 该编译器宏列表的更新版本位于Pre-defined Compiler Macros project at sourceforge【参考方案2】:

对于 GCC:

#ifdef __GNUC__

对于 MinGW:

#ifdef __MINGW32__

x86_64-w64-mingw32-gcc 定义了__MINGW32____MINGW64__

【讨论】:

您的测试用例是否包含 MinGW-64? 这个答案是在 MinGW-64 之前编写的。但我认为这也定义了__MINGW32__ 宏。所以应该仍然有效 这有点争议。我找不到MinGW-64 offered by the project.... 解决不存在的问题毫无意义.... @jww MinGW-w64 是 MinGW 的硬分叉,因为 MinGW 做得不好。现在几乎每个人都使用 MinGW-w64,而不是原来的 MinGW。与 MSYS2 和 MSYS 相同。

以上是关于如何在 C++ 预处理器中检测 g++ 和 MinGW?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?

C++ 预处理器中的前缀增量

如何使用预处理器检测 GCC 线程模型?

g_main_loop_quit 引发 GLib-CRITICAL 错误。如何在 C++ 中处理它?

MFC C++ 应用程序:如何在任务管理器中清除命令行参数?