ホームページ > バックエンド開発 > C++ > 指定イニシャライザが C 11 に存在しないのはなぜですか?

指定イニシャライザが C 11 に存在しないのはなぜですか?

Barbara Streisand
リリース: 2024-12-08 21:11:11
オリジナル
678 人が閲覧しました

Why Were Designated Initializers Absent from C  11?

C の指定イニシャライザ : C 11 に存在しない理由

C 11 での指定イニシャライザの省略は、多くのプログラマにとって依然として興味深い疑問です。 。 C99 では、.age = 18 などの指定された初期化子構文により、構造体の特定のメンバーを簡単に初期化できます。ただし、この機能は C 11 には特にありません。

除外理由

C 11 標準委員会は、指定されたイニシャライザの提案を繰り返し拒否してきました。その理論的根拠は、次のような固有の複雑さから生じています。

不定の実行順序:
C99 には、指定された初期化子式を評価するための特定のルールがありません。評価が行われる順序は不定であり、プログラムの動作に不一致が生じる可能性があります。対照的に、C では、イニシャライザ句の評価の厳密な順序が強制されます。

互換性の問題:
指定されたイニシャライザを C で実装するには、既存の C99 実装との互換性を破壊する必要がありました。これにより、コードの移行時に不整合や潜在的なエラーが発生する可能性があります。

ネストと配列の制限:
C99 では、指定された初期化子のネストと指定された配列の初期化が許可されます。これらの機能は、言語の一貫性を損なうことなく C に組み込むのが難しいことが判明しました。

C99 標準衝突:
C99 の指定初期化子では、すべてのメンバーを指定せずにメンバーの初期化も可能です。これは、構造体のメンバーのすべてを指定子を使用して初期化する必要がある、またはまったく初期化する必要がないという C の要件とは対照的です。

C 20 での限定的なサポート

業界の需要に応えて、その後、C 委員会は C 20 で指定イニシャライザの限定的なサポートを導入しました。ただし、この実装では、上記の懸念に対処する制限が課されます。指定された初期化子は厳密な宣言順序で使用する必要があり、ネストと配列の初期化はサポートされていません。また、構造体のメンバーのすべてを指定子で初期化するか、まったく初期化しない必要があります。

代替

C99 スタイルの指定イニシャライザがないにもかかわらず、C はクラスを初期化するための代替メソッドを提供しますmembers:

  • コンストラクターの初期化: クラス定義内で明示的なメンバーの初期化を許可します。
  • メンバーの初期化リスト: メンバーの直接の初期化を有効にします。コンストラクター内。
  • 集計初期化: 指定された初期化と似ていますが、集約タイプ (構造体など) に適用されます。

以上が指定イニシャライザが C 11 に存在しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート