Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改变目标C标准有什么效果吗?_C_Gcc_Standards - Fatal编程技术网

改变目标C标准有什么效果吗?

改变目标C标准有什么效果吗?,c,gcc,standards,C,Gcc,Standards,我对使用C11编译器编译有效C99代码的效果感兴趣。有实际的区别吗 举个例子,你能改变吗 gcc -c -pedantic -std=c99 source.c 到 如果source.c是有效的C99,你能实现任何目标吗?这会引入回归,还是免费提供优化 我对gcc特别感兴趣,不过最欢迎回答其他编译器的问题 我使用了作为快速检查,以查看C99和C11之间的差异 我注意到,gets在C11中被删除,所以这是一种可能的回归。我能看到的另一个问题是,如果代码执行类似于版本检测的操作,而这不是未来的证明

我对使用C11编译器编译有效C99代码的效果感兴趣。有实际的区别吗

举个例子,你能改变吗

gcc -c -pedantic -std=c99 source.c

如果
source.c
是有效的C99,你能实现任何目标吗?这会引入回归,还是免费提供优化

我对gcc特别感兴趣,不过最欢迎回答其他编译器的问题


我使用了作为快速检查,以查看C99和C11之间的差异


我注意到,
gets
在C11中被删除,所以这是一种可能的回归。我能看到的另一个问题是,如果代码执行类似于版本检测的操作,而这不是未来的证明,比如
。\if uu STDC\u version\uuu==199901L

对于维护C标准的委员会来说,向后兼容性被认为是非常重要的

您可以预期,当使用新标准的设置编译时,根据上述标准编写的严格一致的程序将以相同的方式运行,除非

  • 程序使用已删除的功能(
    从C99移动到C11时获取
  • 该程序使用的功能是可选的,而不是由编译器提供的(例如复杂类型或VLA)
后者不太可能真正影响到您,因为不希望拥有这些功能的编译器现在将它们删除,因为它们是可选的。更可能的情况是,如果C11模式下的编译器不支持VLA,那么它在C99模式下也不支持VLA(并且在这方面不符合C99)

对于不严格符合要求的程序(大多数实际程序),您还必须检查新添加的内容是否不会干扰您的代码。需要注意的是:

  • 与您自己的标题同名的新标准标题
  • 在新标准中使用的保留标识符使用不正确。特别是以下划线和大写字母开头的标识符

其中一种方法是生成asm文件并进行比较,然后深入挖掘。我相信有效的c99代码应该在c11模式下编译相同的文件(当然是减去gets)。@user58697从标准中删除
gets()
并不意味着不允许支持它,只是没有必要。它只是不再需要了。同时支持C9x和C11的编译器可能不会将其从库中踢出。@glglgl我工作时没有gcc,所以我无法尝试,但我认为gcc一直警告使用
get
。我认为,如果通过实验实现的@bubble编程没有提供可靠的答案,特别是当关注的是标准行为时,特别是当关注的是标准行为时,这一切都是关于实现独立性的,那么
-pedantic errors
实际上可能会出错。
gcc -c -pedantic -std=c11 source.c