- 締切済み
相互に参照する構造体について
Cプログラミングについての質問です。よろしくお願いします。 以下のヘッダファイル(defx.h, defy.h)および、mainファイルが正しくコンパイルされるということなのですが、自分の環境(WinXP下でのgcc(MinGW))ではエラーが出ます。 エラー内容は error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here です。 <defx.h> #if !defined(__SX) #define __SX typedef struct __sy SY; typedef struct { int a; SY *b; } SX; #endif <defy.h> #if !defined(__SY) #define __SY #include "defx.h" typedef struct __sy { int c; SX d; } SY; #endif mainファイルについては #include "defx.h" #include "defy.h" int main(void) { SX s; SY t; } 以上ですが、 よろしくお願い致します。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
> gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません GCCにヘッダファイルをプリコンパイルヘッダを生成してしまいます。 やって悪いとはいいませんが、ここでは不要ですし、おそらく意図した操作でもないでしょう。 そうではなく、コマンドにg++ではなくgccを使うと、main.cppはCのソースとしてコンパイルされてしまいます。 C++であれば、定義に矛盾がないかぎりtypedefは重複してもかまいませんが、Cの場合はコンパイルエラーになります。今回の問題は、まさにそこにあります。
- Tacosan
- ベストアンサー率23% (3656/15482)
本題とは関係ありませんが, gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません>#5. 実際, 今の例でもちゃんと動きます (実験済み). もちろん「他の処理系」のことを念頭に置くと「ヘッダファイルは与えない方がよい」のは事実ですが.
- jacta
- ベストアンサー率26% (845/3158)
>gcc main.cpp defx.h defy.h これはダメでしょう。 g++ main.cpp とすれば、ちゃんとコンパイルできましたよ。
- akayoroshi
- ベストアンサー率50% (46/91)
#include しているのだから、コンパイルコマンドは >gcc main.cpp だけでいいのではないでしょうか
- akayoroshi
- ベストアンサー率50% (46/91)
これでどうでしょうか <defx.h> #if !defined (__SX) #define __SX struct sy; struct sx{ int a; struct sy *b; }; typedef struct sx SX; #endif <defy.h> #if !defined (__SY) #define __SY struct sx; struct sy { int c; struct sx *d; }; typedef struct sy SY; #endif <main.c> #include <stdio.h> #include "defx.h" #include "defy.h" int main() { SX s; SY t; s.a=1; s.b=&t; t.c=-1; t.d=&s; printf("s.a = %d\n",s.b->d->a); printf("t.c = %d\n",t.d->b->c); }
- Tacosan
- ベストアンサー率23% (3656/15482)
書き換えてダメだったときには, 「このように書き換えたんだけど」とプログラムを出すようにしてください. わざわざ秘密にして他人に当てさせる必要性なんて, 微塵もないはずだよね. さておき, #2 の「typedef するのをやめる」というのは, 「単純に typedef を消す」という意味ではありません. 「SY に typedef するのをやめて, 構造体の宣言だけをする」という意味です.
お礼
どうもすいませんでした。で、defy.hを以下のように修正した結果、 コンパイル通りました。 #if !defined(__SY) #define __SY #include "defx.h" struct __sy { int c; SX d; }; #endif
- Tacosan
- ベストアンサー率23% (3656/15482)
defy.h で typedef するのをやめればいいとおもう. ついでにいうと「_」ではじまる識別子はあまり使わない方がいい.
補足
御回答有難う御座いました。 回答の通りにしてコンパイルしてみたが、 以下のエラーが出ました。 defy.h:13: error: 'SY' redeclared as different kind of symbol defx.h:8: error: previous declaration of 'SY' was here main.c:8: error: syntax error before "t" defy.h:13: error: 'SY' redeclared as different kind of symbol defx.h:8: error: previous declaration of 'SY' was here
- jacta
- ベストアンサー率26% (845/3158)
Cでコンパイルしようとしているのでは? C++ならコンパイルできると思います。
補足
御回答有難う御座いました。 回答の通りC++としてコンパイル (mainファイルの拡張子を.cから.cppに変更、中身はそのまま) してみましたが、以下のエラーが出ました。 defy.h:13: error: redefinition of typedef 'SY' defx.h:8: error: previous declaration of 'SY' was here なお、コンパイル方法は次の通りです。 >gcc main.cpp defx.h defy.h
お礼
有難う御座いました。 コンパイル通りました。 C++ではコンパイルできましたが、 Cではコンパイルできないということでしょうか? 他の方の回答でCでコンパイル出来るか考えてみます。