4

以下のそれぞれの異なる標準の独立した部分を実装するコンパイラは、どのように異なる必要がありますか?それらすべてをサポートするために必要なモード(たとえば、コマンドラインフラグによって指定される)の数はどれくらいですか?

  1. ISO / IEC 9899:1990
  2. ISO / IEC 9899:1990 + ISO / IEC 9899 TCOR1
  3. ISO / IEC 9899:1990 + ISO / IEC 9899 TCOR1 + ISO / IEC 9899 AM1
  4. ISO / IEC 9899:1990 + ISO / IEC 9899 TCOR1 + ISO / IEC 9899 AM1 + ISO / IEC 9899 TCOR2
  5. ISO / IEC 9899:1999
  6. ISO / IEC 9899:1999 + ISO / IEC 9899:1999Cor。1:2001(E)
  7. ISO / IEC 9899:1999 + ISO / IEC 9899:1999Cor。1:2001(E)+ ISO / IEC 9899:1999Cor。2:2004(E)
  8. ISO / IEC 9899:1999 + ISO / IEC 9899:1999Cor。1:2001(E)+ ISO / IEC 9899:1999Cor。2:2004(E)+ ISO / IEC 9899:1999Cor。3:2007(E)
  9. ISO / IEC 9899:2011
4

1 に答える 1

6

TC(技術的正誤表または技術的修正)は、対応する基本標準の一部として扱う必要があります。したがって、実際に対処できる4つの標準があります。

  1. ISO / IEC 9899:1990プラスTC。
  2. ISO / IEC 9899:1990 + AM1(事実上9899:1995)とTC。
  3. ISO / IEC 9899:1999とTC。
  4. ISO / IEC 9899:2011

C90の修正1は、ワイド文字とマルチバイト文字セット用の新しいヘッダーと関数を追加したため、真に新しい標準素材が含まれていました。技術的な正誤表は、標準的な文言の問題を修正し、明確にする必要があるものを明確にし、ドキュメントの技術的なエラーを修正します。

したがって、これらの4つのモードで十分であることをお勧めします。

  • -std=c90
  • -std=c95
  • -std=c99
  • -std=c11

または、Y2K問題の原因となった間違いに注意を払う場合は、次のようにします。

  • -std=c1990
  • -std=c1995
  • -std=c1999
  • -std=c2011

(これの利点の1つは、最新の標準の数がもう一度最大になることです!)


独立した実装の場合、必要な4つのヘッダーにはいくつかの違いがあります。

  • <stddef.h>
  • <limits.h>
  • <float.h>
  • <stdarg.h>

C99va_copy()に追加された追加のマクロ/関数がありました。<stdarg.h>

修正

C99の関連部分を確認したところ、C99での独立した実装に必要な追加のヘッダーがいくつかあります。

§4適合性

¶6適合実装の2つの形式は、ホスト型独立型です。準拠するホスト型実装は、厳密に準拠するプログラムを受け入れるものとします。準拠する自立型実装は、複雑な型を使用せず、ライブラリ句(7節)で指定された機能の使用が標準ヘッダー、、、、、、、、およびの内容に限定される厳密に準拠するプログラム<float.h>を 受け入れる<iso646.h>ものとします 。準拠する実装には、厳密に準拠するプログラムの動作を変更しない限り、拡張機能(追加のライブラリ関数を含む)が含まれる場合があります。3)<limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>

3) これは、準拠する実装が、この国際規格で明示的に予約されているもの以外の識別子を予約しないことを意味します。

§5.1.2.1自立型環境

¶1自立型環境(オペレーティングシステムの利点なしにCプログラムの実行が行われる可能性がある)では、プログラムの起動時に呼び出される関数の名前とタイプは実装によって定義されます。自立型プログラムで利用可能なライブラリー機能は、第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()ます。)コードが「適切」であり、使用前にプロトタイプで宣言または定義された関数があり、暗黙的でない場合intタイプ(およびプロトタイプ表記を使用して定義されたすべての関数を強くお勧めします)の場合、C90自立型プログラムに適していたものがC99またはC11で機能します。

于 2011-12-30T18:13:05.790 に答える