Jon*_*ler 97
我在编码中一直使用它.
该-ansi标志等同于-std=c89.如上所述,它关闭了GCC的一些扩展.添加-pedantic会关闭更多扩展并生成更多警告.例如,如果您的字符串文字超过509个字符,则会-pedantic发出警告,因为它超出了C89标准所要求的最小限制.也就是说,每个C89编译器必须接受长度为509的字符串; 他们被允许接受更长时间,但如果你是迂腐的话,使用更长的字符串是不可移植的,即使允许编译器接受更长的字符串,并且没有迂腐警告,GCC也会接受它们.
Waz*_*ery 76
如果可能的话,GCC编译器总是尝试编译您的程序.但是,在某些情况下,C和C++标准指定禁止某些扩展.当遇到这些扩展时,符合gcc或g ++等编译器必须发出诊断信息.例如,gcc编译器的-pedantic选项会导致gcc在这种情况下发出警告.使用更严格的
 -pedantic-errors选项可将此类诊断警告转换为错误,从而导致编译在这些点上失败.只有那些需要由符合标准的编译器标记的非ISO构造才会生成警告或错误.
Ant*_*ala 20
-ansi是请求编译器根据27岁的编译过时的开关的C标准过时的修订,ISO/IEC 9899:1990,这基本上是ANSI标准的品牌重塑X3.159-1989"C语言编程.为什么过时了吗?C90是由ISO出版后因为,ISO一直负责的C标准化的,任何技术勘误到C90已经由ISO出版.因此,它是更容易使用-std=c90.
如果没有这个开关,最近的GCC C编译器将符合ISO/IEC 9899:2011中标准化的C语言.
不幸的是,有一些懒惰的编译器供应商认为坚持使用较旧的过时标准版本是可以接受的,标准化文档甚至不能从标准机构获得.
使用该开关有助于确保代码应该在这些过时的编译器中编译.
这-pedantic是一个有趣的.如果没有-pedantic,即使要求特定标准,GCC仍将允许一些C标准中不可接受的扩展.考虑例如程序
struct test {
    int zero_size_array[0];
};
除了可选的类型限定符和关键字static之外,[和]可以分隔表达式或*.如果它们分隔表达式(指定数组的大小),则表达式应具有整数类型.如果表达式是常量表达式,则其值应大于零.[...]
C标准要求数组长度大于零; 而这一段受到限制 ; 标准说明如下5.1.1.3p1:
如果预处理转换单元或转换单元包含违反任何语法规则或约束的情况,则符合要求的实现应生成至少一条诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现 - 定义.在其他情况下不需要生成诊断消息.9)
但是,如果使用编译程序gcc -c -std=c90 pedantic_test.c,则不会生成警告.
-pedantic使编译器实际符合C标准 ; 所以现在它会产生警告,正如标准所要求的那样:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~
因此,为了最大程度的可移植性,指定标准修订版是不够的,您还必须使用-pedantic(或-pedantic-errors)确保GCC实际上符合标准的字母.
这个问题的最后一部分是有关使用-ansi与C++.ANSI从未标准化C++语言 - 仅从ISO中采用它,因此这与"法国标准化的英语"一样有意义.然而,GCC似乎仍然接受它用于C++,听起来很愚蠢.
Fra*_*oto 14
基本上,它将使您的代码更容易在其他编译器下编译,这些编译器也实现ANSI标准,并且,如果您在其他操作系统/平台下小心使用哪些库/ api调用.
第一个,关闭GCC的特定功能.(-ansi)第二个,会抱怨任何不符合标准的东西(不仅是GCC的具体特征,而且也是你的构造.)(-pedantic).
如果您的代码需要是可移植的,那么您可以测试它编译时没有任何gcc扩展或其他非标准功能.如果您的代码-pedantic -ansi在理论上编译,那么它应该与任何其他ANSI标准编译器一起编译.
如果您正在编写的代码预计将在各种平台上使用许多不同的编译器进行编译,那么您自己使用这些标志将有助于确保您不会生成只能在 GCC 下编译的代码。
| 归档时间: | 
 | 
| 查看次数: | 104578 次 | 
| 最近记录: |