更改目标C标准是否实现了任何目标?

时间:2014-04-23 05:25:03

标签: c gcc standards

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

举个例子,可以改变

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

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

实现source.c有效C99的任何事情?这会引入回归,还是免费提供优化?

我对gcc特别感兴趣,尽管对其他编译器的解答非常受欢迎。


我使用C11 Wikipedia page作为快速检查来查看C99和C11之间的区别。

我注意到在C11中删除了gets,因此这是一个可能的回归。我能看到的唯一另一个问题是,代码是否像版本检测那样不会出现面向未来的问题,例如#if __STDC_VERSION__ == 199901L

1 个答案:

答案 0 :(得分:0)

向后兼容性对于维护C标准的委员会来说非常重要。

根据前面标准编写的严格符合程序在使用新标准的设置进行编译时可以完全相同,除非

  • 该程序使用已移除的功能(从C99移至C11时gets
  • 程序使用一个可选的功能,编译器不提供该功能(例如复杂类型或VLA)

后者不太可能真正打击你,因为预计具有这些功能的编译器会删除它们,因为它们是可选的。如果C11模式下的编译器不支持VLA,则更有可能在C99模式下也不这样做(并且在这方面不符合C99)。

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

  • 与您自己的标题同名的新标准标题
  • 错误使用已在新标准中使用的保留标识符。特别是,以下划线和大写字母开头的标识符
相关问题