【问题标题】:Are there preprocessor defines to differentiate gcc and g++ code?是否有预处理器定义来区分 gcc 和 g++ 代码?
【发布时间】:2017-05-03 04:41:21
【问题描述】:

gcc 和 g++ 编译器中是否定义了预处理器宏,这样如果我想让我的 C 代码链接到 C 标准库或 C++ 标准库?类似的东西:

someFile.c

#ifdef __CPP__
   #include <c++ library include>
#else
   #include <c library include>

我确定有,但快速的 Google 搜索并没有立即指向我,而且我确定有人会发布重复的问题,但无论如何,请为我指明正确的方向。

【问题讨论】:

  • 请注意,用 C++ 编译器编译 C 文件是个坏主意,反之亦然,它们是不同的语言,有更好的方法来做任何你想做的事情
  • 您也可以将 C 版本用于 C++ 中的公共头文件(例如,#include &lt;stdio.h&gt; 在 C++ 中很好)
  • 感谢您的关注,相信我的代码无处可去...只是练习一些编码问题并在 gcc 和 g++ 编译器上尝试一下,看看哪些有效,哪些无效...
  • 谢谢你们“#ifdef __cplusplus”工作正常!
  • 请注意g++ gcc 编译器。它只是一个包装器,编译后告诉链接器链接 C++ 标准库。

标签: c++ c gcc g++


【解决方案1】:

在c++中你可以吗

#ifdef __cplusplus

例如,如果 c++ 代码您希望编译器将某些代码作为 c 代码处理,您需要将该块放入

#ifdef __cplusplus
   extern "C" {
#endif

#ifdef __cplusplus
}
#endif

【讨论】:

    【解决方案2】:

    我不确定是否有特定于 GCC 的 #defines,但 C++ 标准定义了符号 __cplusplus。如果存在,那么您使用的是 C++ 编译器。

    【讨论】:

      【解决方案3】:

      正如其他答案所指出的,测试 __cplusplus predefined macro 的定义将起作用:

      __cplusplus 表示正在使用的 C++ 标准的版本,扩展为 值 199711L(C++11 之前)、201103L (C++11)、201402L (C++14) 或 201703L (C++17)。


      还有一个可能对您有用的 GCC 特定宏,__GNUG__。如GCC documentation中所述:

      __GNUG__

      GNU C++ 编译器定义了这一点。测试它相当于测试 (__GNUC__ && __cplusplus)。

      链接的 GCC 文档还列出了由不同 GNU 编译器定义的其他宏。

      【讨论】:

        【解决方案4】:

        6.10.8 Predefined macro names C11 标准中说(强调我的)

        实现不应预定义宏__cplusplus,也不应在任何标准头文件中定义它。

        我相信 C++ 要求一个符合规范的实现来定义该名称,因此您可以使用它来区分语言

        #ifdef __cplusplus
        /* c++ code */
        #else
        /* c code */
        #endif
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-27
          • 2011-01-14
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          • 2011-06-09
          • 2017-10-27
          相关资源
          最近更新 更多