2010-12-20 18 views
2

私は、古いコードを20年前のDOSシステムからGNU Linuxシステムに移植しようとしています。ヘッダファイルのいくつか(場所のいたるところに含まれています)には、宣言して初期化する構造体の構造体があります。レガシーコードが書かれた方法でコンパイルすると警告が出ます。どのように私はこれを同じヘッダーファイル内にとどまることで動作させることができるかに関するヒント?Cでヘッダファイル内の構造体の構造体を初期化する方法は?

以下は、私が行っていることを単純化した例です。 A、すなわち前

struct A 
{ 

    struct B temp1; 
    struct C temp2; 
}; 

struct B 
{ 

    int temp3; 
    int temp4; 
    int temp5; 
}; 

struct C 
{ 

    int temp6; 
    int temp7; 
    int temp8; 
}; 


//These are the variables in how they are related to the initialization below 

//struct A test_one = {{temp3,temp4,temp5},{temp6,temp7,temp8}}; 

struct A test_one = {{1,2,3},{4,5,6}}; 
+2

警告は何ですか? – OrangeDog

答えて

1

宣言構造体BおよびC:

struct B { int temp3; int temp4; int temp5; }; 
struct C { int temp6; int temp7; int temp8; }; 
struct A { struct B temp1; struct C temp2; }; 
+0

私は悪い、私は単純な例を構成していた。実際のコードでは、構造体AはBとCの後に宣言されます。 – user548800

6

あなたはヘッダファイル内の任意の構造をインスタンスべきではありません。それぞれのCファイルに異なるインスタンスが作成された場合は、ヘッダーをインクルードします。このヘッダーは、通常は目的のエフェクトではありません。

これを行うには、次の操作を行う必要があります。

void foo(){ 
struct A parent; 
struct B child_b; 
struct C child_c; 

child_b.temp3 = 3; 
child_b.temp4 = 4; 
child_b.temp5 = 5; 

child_c.temp6 = 6; 
child_c.temp7 = 7; 
child_c.temp8 = 8; 

parent.temp1 = child_b; 
parent.temp2 = child_c; 
} 

あなたは、配列の初期化構文はその後、労働組合を使用することを検討し続ける希望の場合、私は強く、この

void initB(struct B* s, int x, int y, int z){ 
    s->temp3 = x; 
    s->temp4 = y; 
    s->temp5 = z; 
} 

に似たヘルパー関数を作る検討します。

+0

特に静的宣言されていないためです。私は何度も同じようなことをやった人を知っています。何度も言い換えれば、多重定義された変数への参照ごとに、リンカーはインスタンスの1つをランダムに使用しているようです。 – JeremyP

+0

@ JeremyP:ヘッダーファイルの変数 'extern'を*宣言し、ちょうど1つのコンパイル単位でインスタンス化して初期化する必要があります。 –

+0

私は実際にヘッダーの代わりにCファイルの中でこの同じことをやろうとしましたが、私は同じ警告を受けています。私は元の質問を "どのようにCの構造体の構造体を初期化するか"という言い換えをするべきだと思います。私が得ようとしている警告は、「初期化に近いブラケットがありません」という警告と「初期化に近い」という警告です。 – user548800

0

投稿したコードは、structのメンバーを宣言するために不完全な型を使用することは違法であるため、コンパイルできません。私はあなたが単にあなたのstructの定義を間違って並べたと仮定します:BCの定義が最初になるはずです。

このコードで生成できる唯一の警告は、ヘッダーファイルが複数の翻訳単位に含まれている場合、同じオブジェクトtest_oneの複数の定義について不平を言う可能性のあるリンカーからの警告です。 Cでは、これは技術的には違法ですが、多くのコンパイラでは一般的なコンパイラ拡張として認められています。

だから、どのような「警告」が表示されていますか?

+0

私は "initializer around around ...."の警告とともに、 "initializer around bracket"という警告を表示しています。 – user548800

関連する問題