2

是否为 -std=c99 提供了子选项,以便我可以通过这些子选项并避免通过 -std=c99?

例如:

int main()
{
    for(int i=0;i<10;i++)
    {
        i++;
    }
    return 0;
}

我会通过传递任何子选项来用 gcc 编译这段代码。

$ gcc -sub-option-for-c99 ac

谢谢

编辑:我只想从 C99 中选择一个特性,同时将编译器的其余部分保持在 C89(或其他)模式。

4

4 回答 4

3

C99 没有太多的子设置功能(基本上没有子设置)。C11 确实对此有一些规定。但是,实现的细节往往由实现控制,而不是程序员可以通过整体开关(例如-std=c11或)改变的东西-std=gnu11这是说“不”的冗长方式。

C11 中的子设置示例:附件 K(以前的 TR 24731-1)边界检查接口。

程序可以通过定义来表明它想要使用这些设施__STDC_WANT_LIB_EXT1__,但是如果实现本身没有定义,那将无济于事__STDC_LIB_EXT1__

来自 ISO/IEC 9899:2011 的更完整的子设置列表(Corr.1 应用于 的值__STDC_LIB_EXT1__):

6.10.8.3 条件特征宏

¶1以下宏名称由实现有条件地定义:

  • __STDC_ANALYZABLE__整数常数 1,旨在表明符合附录 L(可分析性)中的规范。
  • __STDC_IEC_559__整数常量 1,旨在表明符合附件 F(IEC 60559 浮点运算)中的规范。
  • __STDC_IEC_559_COMPLEX__整数常量 1,旨在表明符合附录 G(IEC 60559 兼容的复数运算)中的规范。
  • __STDC_LIB_EXT1__整数常量 201112L,用于表示对附件 K(边界检查接口)中定义的扩展的支持。179)
  • __STDC_NO_ATOMICS__整数常量 1,意在表明实现不支持原子类型(包括_Atomic 类型限定符)和<stdatomic.h>标头。
  • __STDC_NO_COMPLEX__整数常量 1,意在表明实现不支持复杂类型或标头。
  • __STDC_NO_THREADS__整数常量 1,意在表明实现不支持<threads.h>头文件。
  • __STDC_NO_VLA__整数常量 1,旨在表明实现不支持可变长度数组或可变修改类型。

¶2定义__STDC_NO_COMPLEX__不应定义 的实现__STDC_IEC_559_COMPLEX__

179)目的是保持一个整数常量,long int随着本国际标准的每次修订而增加。

有关相关信息,另请参阅第6.10.8 节预定义的宏名称。

请注意,这些宏是由实现定义或不定义的,具体取决于它支持或不支持的内容。如果您尝试自己设置它们,那将没有任何区别;它们旨在用于与您进行通信的实现,反之亦然。


ISO/IEC 9899:1999 §6.10.8 预定义的宏名称

¶2以下宏名称由实现有条件地定义:

  • __STDC_IEC_559__整数常量 1,旨在表明符合附件 F(IEC 60559 浮点运算)中的规范。
  • __STDC_IEC_559_COMPLEX__整数常量 1,旨在表明遵守信息性附录 G(IEC 60559 兼容的复数算术)中的规范。
  • __STDC_ISO_10646__yyyymmL 形式的整数常量(例如 199712L),用于指示 wchar_t 类型的值是 ISO/IEC 10646 定义的字符的编码表示,以及指定年份和月份的所有修订和技术勘误.

¶3 预定义宏的值(除了__FILE____LINE__)在整个翻译单元中保持不变。

¶4 这些宏名称和定义的标识符都不应成为 a #define#undef预处理指令的主题。任何其他预定义的宏名称应以前导下划线开头,后跟大写字母或第二个下划线。

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

6.10.8 节及其子节在 ISO/IEC 9899:2011 中类似,但所讨论的宏集更为广泛。

于 2013-06-03T06:49:24.503 回答
0

我不这么认为,这通常是预处理器的任务

#if __STDC_VERSION__ < 199901L
    int i;
    for(i=0;i<10;i++)
#else
    for(int i=0;i<10;i++)
#endif

虽然在这种情况下看起来有点愚蠢。

于 2013-06-03T06:38:16.230 回答
0

是否为 -std=c99 提供了子选项,以便我可以通过这些子选项并避免通过 -std=c99

不!gcc 没有提供任何此类规定。通过 -std=c99 并享受。

于 2013-06-03T06:31:03.767 回答
0

这个-std=论点怎么样:

'gnu89' ISO C90 的 GNU 方言(包括一些 C99 功能)。这是 C 代码的默认设置。

于 2013-06-03T06:42:01.960 回答