【问题标题】:Is there a preprocessor macro to detect C99 across platforms?是否有用于跨平台检测 C99 的预处理器宏?
【发布时间】:2013-11-09 13:30:53
【问题描述】:

C++ 有一个__cplusplus 预处理器定义,可让您检测版本。 C有什么类似的吗?

我希望它可以跨 XCode、GCC 和 Visual Studio 版本移植。

【问题讨论】:

    标签: c macros c99


    【解决方案1】:

    根据维基百科C99上的文章

    A standard macro __STDC_VERSION__ is defined with value 199901L to indicate that C99 support is available

    #if __STDC_VERSION__ >= 199901L
       /*C99*/
    #else
      /*Not C99*/
    #endif
    

    【讨论】:

    • __STDC_VERSION__ 在 C90 编译器中可能没有定义,你应该先检查它是否定义,否则你会得到一个编译时错误。
    • 默认情况下,此宏在 MSVS C 中不起作用。MSVS docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros 声明:__STDC_VERSION__ 在编译为 C 并指定 /std C11 或 C17 选项之一时定义。 /std:c11 扩展为 201112L,/std:c17 扩展为 201710L。
    【解决方案2】:

    您可以测试宏__STDC_VERSION__的值(注意开头和结尾有两个下划线),对于C99兼容的平台,它应该大于或等于199901L

    C11(ISO/IEC 9899:201x) §6.10.8.1 强制宏

    __STDC_VERSION__整数常量201ymmL

    在脚注中:

    此宏未在 ISO/IEC 9899:1990 中指定,在中指定为 199409L ISO/IEC 9899/AMD1:1995 和 ISO/IEC 9899:1999 中的199901L。这样做的目的是 保持long int 类型的整数常量,随着本国际标准的每次修订而增加。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2011-10-26
      • 2015-04-05
      • 2012-05-29
      相关资源
      最近更新 更多