29

tag を持つ完全に定義された構造体があり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。これには理由がありますか?

4

2 に答える 2

43

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

あなたの最初のケース:

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

初期化に固有の構文です。言語のペダンティクスにおける2番目のケースは、初期化ではなく割り当てです。割り当ての右側は、正しい型の構造体でなければなりません。C99 より前は、構造体リテラルを記述するための構文が言語にありませんでした。これは、あなたがやろうとしていることです。{x,y,..,z} は、式が内部にあるブロックのように見えました。言語はそうではありませんが、それをリテラル値と考えようとするように促された場合、その型を確信することはできませんでした。(あなたの文脈では、あなたは良い推測をすることができます。)

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

q = (struct MyStruct){x,y,...,z};
于 2012-08-30T04:06:29.130 に答える
25

これを行うことができますが、集計の前に構造の型を指定する必要があります。

struct MyStruct q;
q = (struct MyStruct){x,y,...,z};
于 2012-08-30T03:46:49.853 に答える