是否为-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(或其他)模式。
答案 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预定义宏名称部分。
请注意,这些宏是由实现定义的或未定义的,具体取决于它支持或不支持的内容。如果你试图自己设置,它将没有任何区别;它们旨在实现与您沟通,而不是相反。
¶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代码的默认值。