CまたはC++標準が実装定義の動作として記述しているバージョン間で動作の一貫性を維持することは、コンパイラにとって必須ですか?
たとえば、符号付き整数に対する一部のビット演算の結果は、同じである必要がありgcc 4.6
ますgcc 4.8
。
CまたはC++標準が実装定義の動作として記述しているバージョン間で動作の一貫性を維持することは、コンパイラにとって必須ですか?
たとえば、符号付き整数に対する一部のビット演算の結果は、同じである必要がありgcc 4.6
ますgcc 4.8
。
一貫している必要はありません。文書化する必要があるだけです。ドラフト C99 標準セクションの3
用語、定義、および記号では、次のように定義されています。
実装定義の動作
各実装が選択がどのように行われたかを文書化する不特定の動作
たとえば、gcc
ドキュメントにはセクションC Implementation-defined behaviorがあります。
C++ ドラフト標準にも同様の定義があり、セクション1.9
プログラムの実行パラグラフ2には次のように記載されています。
抽象マシンの特定の側面と操作は、この国際規格で実装定義として記述されています (たとえば、sizeof(int))。これらは、抽象マシンのパラメータを構成します。各実装には、これらの点でその特性と動作を説明するドキュメントが含まれる必要があります。6 [...]
定義済みの実装とは、コンパイラの作成者が何が起こるかを選択することを意味し、それだけです。あなたが考えを変えて、あなたが望む別のやり方をするのを止めるものは何もありません。同じコンパイラの異なるバージョン間で一貫性を保つことを強制するものは何もありません。
C 標準の観点からは、「同じ」コンパイラの 2 つのバージョンは 2 つの異なる実装です。(まあ、前者は既知の準拠エラーのために C 実装ではないことがわかっている可能性が高く、後者も未知の準拠エラーのために C 実装ではない可能性が高いです...) 一般に、実装者はただし、実装定義の動作がバージョン間で同じままであるという独自の保証を提供します。これは、彼らがすでに動作を定義しており、それを変更した場合、製品で信頼できる動作として既に文書化されているものとの明示的な非互換性を作成しているためです.