编译器是否必须保持 C 或 C ++ 标准描述为实现定义的行为的版本之间的行为一致?< / p>
例如,有符号整数的某些按位运算的结果在gcc 4.6
中必须相同,并在gcc 4.8
中说明?
答案 0 :(得分:3)
它不必一致,只需要记录,draft C99 standard部分3
术语,定义和符号定义如下:
实现定义的行为
未指明的行为,其中每个实现记录了如何做出选择
例如,gcc
文档有一个C Implementation-defined behavior部分。
C++ draft standard也有类似的定义,在1.9
节目执行段落 2 中说:
抽象机的某些方面和操作在本国际标准中描述为实现定义的(例如,sizeof(int))。这些构成了抽象机器的参数。每个实施应包括描述其在这些方面的特征和行为的文件。 6 [...]
答案 1 :(得分:2)
没有
C标准规定了一些事情。对于那些实现定义的,它并不强制要求你在版本之间保持一致。
这无论如何都不会非常有用 - 是什么阻止你创建“Extra Gcc”而不是“gcc 5”?谁确定哪个版本实际上是从以前版本升级的?
答案 2 :(得分:1)
实现定义意味着编译器编写者会选择发生的事情,就是这样。没有什么可以阻止你改变主意,以另一种方式做你想要的。没有什么能迫使你在同一个编译器的不同版本中保持一致。
答案 3 :(得分:1)
从C标准的角度来看,“相同”编译器的两个版本是两种不同的实现。 (好吧,由于已知的一致性错误,很可能早先知道不是C实现,而后者也可能由于未知的一致性错误而不是C实现......)一般来说,实现者将会但是,它们提供了自己的保证,即实现定义的行为在版本之间保持不变。这是因为他们已经定义了行为,如果他们改变了行为,他们就会创建一种与他们已经记录为您可以依赖其产品的行为的明显不兼容的行为。