我正在写一个标题,需要向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__
。
答案 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
指令强制编译错误。