C标准版检查

时间:2014-10-09 13:37:24

标签: c c89

  • 平台:Ubuntu 14.04 LTS
  • 编译器:GCC 4.8.2(Ubuntu 4.8.2-19ubuntu1)

我正在写一个标题,需要向C90反向投诉。如果编译器支持C99或C11,我有一些可选功能。所以我使用标准功能测试宏。我只是想知道我这样做的方式是否正确。

#if __STDC__
   //code
#endif

#if __STDC_VERSION__ >= 199000L
    //code
#endif

#if __STDC_VERSION__ >= 201100L
   //code
#endif

我假设如果编译器严格地是C90或C89,那么编译器会出错并说__STDC_VERSION__未定义我是否正确?如果是这样,我应该使用defined()?例如#if defined(__STDC__)而不仅仅是#if __STDC__

1 个答案:

答案 0 :(得分:2)

如果预处理器条件中的未定义标识符不是define的参数,则它们将替换为0,因此没有错误:

  

6.10.1条件包含

     

3表格的预处理指令

#if constant-expression new-line groupopt
#elif constant-expression new-line groupopt
     

检查控制常量表达式是否评估为非零   4在评估之前,将在预处理令牌列表中进行宏调用   控制常量表达式被替换(除了那些修改过的宏名称)   由定义的一元运算符),就像在普通文本中一样。如果定义的令牌是   由于此替换过程或使用定义的一元运算符而生成的   在宏替换之前,它与两个指定表单中的一个不匹配,行为是   未定义。 由于宏扩展和定义的一元所有替换后   运算符已执行,所有剩余的标识符(包括那些词法   与关键字相同)被替换为pp-number 0 ,然后进行每次预处理   令牌转换为令牌。 [...]

您可以使用#error指令强制编译错误。