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