C 11 における指定イニシャライザの不在の指定
プログラミングの分野では、C99 標準では指定イニシャライザが目立つようになりました。これらの初期化子を使用すると、開発者は構造体のメンバーに値を選択的に割り当てることができ、コードの読みやすさと簡潔さが向上しました。しかし、これらのイニシャライザが C 11 標準に著しく欠如していることが明らかになり、この省略の背後にある理論的根拠についての調査が行われました。
C 11 標準委員会は、指定されたイニシャライザを含めることについて繰り返し審議し、特徴。しかし、コンセンサスは依然としてそのような提案を断固として拒否している。委員会は、指定されたイニシャライザを実装する取り組みは歴史的に克服できない課題に直面していると考えています。
C99 の次のコード スニペットを考えてみましょう:
struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; }
このコードは、人物の年齢メンバーに値を割り当てます。他のメンバーを初期化しないままにして構造体を作成します。 C99 ではそのような選択的な初期化が許可されていますが、C 11 では許可されていません。
C 11 で指定された初期化子が除外される主な理由の 1 つは、C99 での初期化子の評価順序が予測できないことにあります。標準では、この順序を「不定の順序」と曖昧に説明しており、予期しないプログラム動作の余地が残されています。たとえば、Person 構造体の初期化に副作用のある関数呼び出しが含まれる場合、実行順序によって意図しない結果が生じる可能性があり、コンパイラは必ずしもフラグを立てません。
対照的に、C にはイニシャライザに対して厳しい要件があります。リストの評価。イニシャライザが出現順に実行されることを確認します。このような命令を強制するには、以前の C99 設計との互換性を破壊する必要があり、委員会はこれを受け入れられないとみなしました。
C 11 に指定された初期化子が存在しないことが当初は批判を集めたかもしれませんが、C に含めることには制限が課せられました。 20 件は不確定な動作に関する懸念に対処しました。 C 20 の標準化された評価順序により、開発者は初期化プロセスをより確実に制御できるようになります。
以上がC 11 指定イニシャライザが存在しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。