2012-08-30 4 views
18

タグがMyStructの完全に定義された構造体があり、そのフィールドにはx, y, ..., zの値が許されているとします。なぜstructを直接割り当てることができないのはなぜですか?

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

が許可されていますが、

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

が許可されていませんか?私はこれがとても迷惑であると感じます。私は、以前q宣言した第二の場合には、私は、各フィールドに一つずつ値を割り当てる必要があり:

X, Y, ..., ZMyStructのフィールドである
q.X = x; q.Y = y; ... q.Z = z; 

。この背後には理由がありますか?

あなたがこれを行うことができます
+0

右辺値が具体的なものではなく、その実行時にしかし、最初の割り当ては具体的ですが、バイナリで利用できます(これがelfファイルの場合は.BSSセクションで最も可能性があります)。構造体をお互いに割り当てる場合は、qを初期化したものに割り当てることができます。好き。構造体MyStruct w = {x、y、..、z}; q = w – sardok

答えて

26

あなたが探しているものは、文字通りの化合物です。これはC99の言語に追加されました。

あなたの最初のケース:

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

は、初期化に固有の構文です。 2番目のケースは、言語のペダンティクスでは、初期化ではなく、割り当てです。代入の右辺は、正しい型の構造体でなければなりません。 C99より前には、あなたがやろうとしている構造体リテラルを書くための言語の構文がありませんでした。 {x、y、..、z}は式が内部にあるブロックのように見えました。もしそれが文字通りの価値であると考えるように促されたとしても、その言語はそうではありませんが、そのタイプを確信することはできませんでした。あなたが書くことができるように(。あなたのコンテキストでは、あなたが良い推測を作ることができる)

をこれを許可し、タイプの問題を解決するには、C99は、構文を追加しました:割り当ての

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

+1はC99であることを指定します。おそらく私たちは古いコンパイラで作業しなければならない可能性が高いことを知りませんでした。 – Leo

23

が、あなたはあなたの集計前に構造の種類を提供する必要があります。

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

ここでは、[ideoneへのリンク](http://ideone.com/rB1Fz)の例を示します。 – dasblinkenlight

+2

しかし、C99のみ(Avi Bergerの答えを参照) – AAT

+0

@AATあなたは正しいです、それはC99で追加された機能です。しかし、C99は10年以上にわたって存在してきたので、多くの文脈でCとほぼ同義語になっています。 – dasblinkenlight

関連する問題