なぜ構造体を直接割り当てることができないのでしょうか? 質問する

なぜ構造体を直接割り当てることができないのでしょうか? 質問する

タグ を持つ完全に定義された構造体がありMyStructx, y, ..., zそのフィールドには という値が許可されているとします。なぜ

struct MyStruct q = {x,y,..,z};

許可されていますが、

struct MyStruct q;
q = {x,y,...,z};

は許可されていないのでしょうか? これは非常に面倒です。 2 番目のケースでは、以前に を宣言したのでq、各フィールドに 1 つずつ値を割り当てる必要があります。

q.X = x; q.Y = y; ... q.Z = z;

X, Y, ..., ZのフィールドはどこにありますかMyStruct。これには何か理由があるのでしょうか?

ベストアンサー1

あなたが探しているのは複合リテラルです。これは C99 で言語に追加されました。

最初のケース:

struct MyStruct q = {x,y,..,z};

は初期化に特有の構文です。言語の細かい点では、2 番目のケースは初期化ではなく代入です。代入の右側は正しい型の構造体でなければなりません。C99 より前の言語では、構造体リテラルを記述する構文はありませんでしたが、それがあなたがしようとしていることです。{x,y,..,z} は、中に式があるブロックのように見えました。これをリテラル値として考えようとしても、言語ではそうは考えられず、その型を確信することはできません。(あなたのコンテキストでは、うまく推測できます。)

これを可能にし、型の問題を解決するために、C99 では次のように記述できる構文が追加されました。

q = (struct MyStruct){x,y,...,z};

おすすめ記事