我们有c99子标志吗?

时间:2013-06-03 06:15:09

标签: c gcc compiler-construction c99

是否为-std = c99提供了子选项,以便我可以传递这些子选项并远离传递-std = c99?

例如:

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

我想通过传递任何子选项来使用gcc编译此代码。

$ gcc -sub-option-for-c99 a.c

由于

编辑:我想从C99中选择一个功能,同时保持编译器的其余部分处于C89(或其他)模式。

4 个答案:

答案 0 :(得分: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(Bounds-checking interfaces)中定义的扩展名。 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中类似,但讨论的宏集更为广泛。

答案 1 :(得分:0)

  

是否为-std = c99提供了子选项,以便我可以传递这些子选项并远离传递-std = c99

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

答案 2 :(得分:0)

我不是这样,它通常是预处理器的任务

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

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

答案 3 :(得分:0)

这个-std=论点怎么样:

  

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