dポイントプレゼントキャンペーン実施中!

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 {
inta;
SY*b;
} SX;
#endif
<defy.h>
#if !defined(__SY)
#define __SY
#include "defx.h"
typedef struct __sy {
intc;
SXd;
} SY;
#endif

mainファイルについては
#include "defx.h"
#include "defy.h"

int main(void)
{
SX s;
SY t;
}
以上ですが、
よろしくお願い致します。

A 回答 (8件)

> gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません



GCCにヘッダファイルをプリコンパイルヘッダを生成してしまいます。
やって悪いとはいいませんが、ここでは不要ですし、おそらく意図した操作でもないでしょう。

そうではなく、コマンドにg++ではなくgccを使うと、main.cppはCのソースとしてコンパイルされてしまいます。
C++であれば、定義に矛盾がないかぎりtypedefは重複してもかまいませんが、Cの場合はコンパイルエラーになります。今回の問題は、まさにそこにあります。
    • good
    • 0

本題とは関係ありませんが, gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません>#5&#6. 実際, 今の例でもちゃんと動きます (実験済み).


もちろん「他の処理系」のことを念頭に置くと「ヘッダファイルは与えない方がよい」のは事実ですが.
    • good
    • 0

>gcc main.cpp defx.h defy.h



これはダメでしょう。

g++ main.cpp

とすれば、ちゃんとコンパイルできましたよ。
    • good
    • 0
この回答へのお礼

有難う御座いました。
コンパイル通りました。

C++ではコンパイルできましたが、
Cではコンパイルできないということでしょうか?
他の方の回答でCでコンパイル出来るか考えてみます。

お礼日時:2009/08/05 16:13

#include しているのだから、コンパイルコマンドは


>gcc main.cpp
だけでいいのではないでしょうか
    • good
    • 0

これでどうでしょうか


<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);
}
    • good
    • 0

書き換えてダメだったときには, 「このように書き換えたんだけど」とプログラムを出すようにしてください. わざわざ秘密にして他人に当てさせる必要性なんて, 微塵もないはずだよね.


さておき, #2 の「typedef するのをやめる」というのは, 「単純に typedef を消す」という意味ではありません. 「SY に typedef するのをやめて, 構造体の宣言だけをする」という意味です.
    • good
    • 0
この回答へのお礼

どうもすいませんでした。で、defy.hを以下のように修正した結果、
コンパイル通りました。

#if !defined(__SY)
#define __SY
#include "defx.h"
struct __sy {
int c;
SX d;
};
#endif

お礼日時:2009/08/05 16:46

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

補足日時:2009/08/05 10:25
    • good
    • 0

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

補足日時:2009/08/05 10:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A