如何实现以下每种不同标准的独立部分的编制者必须有所不同?支持所有模式所需的模式数量最少(例如,由命令行标志指定)是什么?
答案 0 :(得分:5)
TC(技术更正或技术更正)应视为相应基准标准的一部分。所以,你真的有4种可能的标准来处理:
C90的修正案1为宽字符和多字节字符集添加了新的标题和函数,因此它包含了真正的新标准材料。技术更正修复了标准措辞中的问题,澄清了需要澄清的内容,并纠正了文档中的技术错误。
所以,我建议这四种模式就足够了:
-std=c90
-std=c95
-std=c99
-std=c11
或者,如果我们要注意导致Y2K问题的错误,那么:
-std=c1990
-std=c1995
-std=c1999
-std=c2011
(这样做的一个优点是最新标准再次具有最高数量!)
对于独立式实现,所需的四个标头之间几乎没有差异:
<stddef.h>
<limits.h>
<float.h>
<stdarg.h>
在C99中有一个额外的宏/函数va_copy()
添加到<stdarg.h>
。
校正
我刚检查了C99的相关部分,在C99中独立实现需要额外的标头:
§4一致性
¶6符合实现的两种形式托管和独立。符合条件 托管实施应接受任何严格符合的计划。一致的 独立实施应接受任何严格符合要求的程序 使用复杂类型并使用库子句中指定的功能 (第7条)仅限于标准标题
<float.h>
的内容,<iso646.h>
,<limits.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
和<stdint.h>
。符合要求的实施可能有扩展(包括附加 库函数),只要它们不改变任何严格符合的行为 程序。 3)3) 这意味着符合标准的实现不会保留除明确标识之外的标识符 在本国际标准中保留。
§5.1.2.1独立环境
¶1在独立环境中(C程序执行可能在没有任何情况下执行) 操作系统的好处),程序调用的函数的名称和类型 startup是实现定义的。任何独立的图书馆设施 程序,除了第4条要求的最小集合外,都是实现定义的。
¶2独立环境中程序终止的影响是实现定义的。
否则,主要更改发生在C99的核心语言中 - 例如新类型(long long
),新的初始化符号和VLA等等。从这个角度来看,AM1(C95)对于独立实现没有任何改变(除非之后添加了有向图),因为主要的变化是在独立实现中不需要的新头中。
托管实现面临更多问题,因为在C90和C99之间对库支持进行了相当广泛的修改。
独立式实施的任何变化是否都会破坏兼容性?换句话说,如果我有一个严格独立的C {1990,1995,1999}符合程序,它是否必须按照预期在符合C11的实现上编译和工作?
我不知道独立而不是托管实现的任何向后兼容性问题。使用C99,“隐式int
”规则正式消失 - 您应该在使用它们之前声明函数,并且返回类型应该是显式的int
(例如,简单的main()
是不再正式有效;您应该写int main()
或更好,int main(void)
或类似内容。但这些是C90(C95)和C99之间的一般变化 - 不是独立实施所特有的。 (是的,我知道独立实现不需要函数main()
作为起点。)如果你的代码是'好'并且在使用之前使用原型声明或定义了函数,并且没有隐式{{1我们强烈建议使用类型(以及使用原型表示法定义的所有函数),那么对C90独立程序有用的东西适用于C99或C11。