C 11 の指定イニシャライザの除外: 委員会の根拠
C99 では、指定イニシャライザは構造体の特定のメンバーを初期化する便利な方法を提供します。 、以下に示すように例:
struct Person { int height; int weight; int age; }; int main() { Person p = { .age = 18 }; }
ただし、C 11 では、この構文は無効です。 C 11 標準委員会は、C99 での実用性にもかかわらず、指定イニシャライザのサポートを含める提案を繰り返し拒否してきました。
除外理由
委員会の主な懸念は、不確定な点にあります。 C99 で指定された初期化子の部分式の評価順序。次の例を考えてみましょう。
struct X { int c; char a; float b; }; struct X foo = { .a = (char)f(), .b = g(), .c = h() };
C99 では、これらの関数呼び出し (f()、g()、および h()) が実行される順序は未定義です。このあいまいさにより、これらの関数が相互作用したり副作用がある場合、プログラムの動作が不定になる可能性があります。
C の厳格なイニシャライザ要件
C99 の柔軟な評価順序とは対照的に、C は初期化句の厳密な逐次評価を義務付けます。その結果、指定されたイニシャライザを C で実装するには、次のような異なる動作が必要になります。
f(); g(); h();
これにより、既存の C99 実装との互換性が失われます。
提案された解決策と制限事項
c 20 標準では、P0329R4 の導入によりこの問題に部分的に対処しています。指定されたイニシャライザのサポートは限定的です。ただし、このサポートは、評価順序が不定であることに伴う複雑さと潜在的な落とし穴を避けるために制限されています。
結論
指定された初期化子を除外するという C 11 標準委員会の決定が推進されました。一貫性のある予測可能な初期化プロセスを維持することへの懸念によるものです。 Boost は指定されたイニシャライザの実装を提供しますが、標準委員会は、複雑さを導入したり互換性を壊したりすることなく、そのような機能を C に統合するという課題を強調しました。
以上がC 11 が C99 のような指定イニシャライザをサポートしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。