是否有预处理器定义来区分gcc和g ++代码?

时间:2017-05-03 04:41:22

标签: c++ c gcc g++

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

someFile.c

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

我确信有一个快速的谷歌搜索没有立即指出我,我确信有人会发布重复的问题,但无论如何,请指出我正确的方向。< / p>

4 个答案:

答案 0 :(得分:10)

在c ++中你可以

#ifdef __cplusplus

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

#ifdef __cplusplus
   extern "C" {
#endif

#ifdef __cplusplus
}
#endif

答案 1 :(得分:5)

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

答案 2 :(得分:0)

正如其他答案所指出的那样,测试__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__&amp;&amp; __cplusplus)。

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

答案 3 :(得分:0)

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

  

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

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

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