使用宏检测 gcc 而不是 msvc / clang

新手上路,请多包涵

到目前为止,我正在开发一个同时使用 gcc 和 msvc 构建的项目。我们最近也开始使用 clang 进行构建。

代码中有一些部分完成了特定于平台的操作:

 #ifndef _WIN32
// ignore this in msvc
#endif

由于 gcc 以前是唯一的非 windows 版本,这相当于说“只为 gcc 做这个”。但现在它的意思是“只为 gcc 和 clang 做这个”。

然而,在某些情况下,我想专门为 gcc 处理一些事情,而不是为 clang。是否有一种简单而可靠的方法来检测 gcc,即

#ifdef ???
// do this *only* for gcc
#endif

原文由 ValarDohaeris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

这些宏由所有使用 C 预处理器的 GNU 编译器定义:C、C++、Objective-C 和 Fortran。它们的值是编译器的主要版本、次要版本和补丁级别,作为整数常量。例如,GCC 3.2.1 会将 GNUC 定义为 3,将 GNUC_MINOR 定义为 2,并将 GNUC_PATCHLEVEL 定义为 1。如果您直接调用预处理器,也会定义这些宏。

还:

 __GNUG__

GNU C++ 编译器对此进行了定义。测试它相当于测试(GNUC && __cplusplus)。

资源

显然, clang 也使用它们。但是它也定义了:

 __clang__
__clang_major__
__clang_minor__
__clang_patchlevel__

所以你可以这样做:

 #ifdef __GNUC__
    #ifndef __clang__
...

甚至更好(注意顺序):

 #if defined(__clang__)
....
#elif defined(__GNUC__) || defined(__GNUG__)
....
#elif defined(_MSC_VER)
....

原文由 dmg 发布,翻译遵循 CC BY-SA 3.0 许可协议

我使用这个定义:

 #define GCC_COMPILER (defined(__GNUC__) && !defined(__clang__))

并用它测试:

 #if GCC_COMPILER
...
#endif

原文由 khaledev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题