
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件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
> gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません
GCCにヘッダファイルをプリコンパイルヘッダを生成してしまいます。
やって悪いとはいいませんが、ここでは不要ですし、おそらく意図した操作でもないでしょう。
そうではなく、コマンドにg++ではなくgccを使うと、main.cppはCのソースとしてコンパイルされてしまいます。
C++であれば、定義に矛盾がないかぎりtypedefは重複してもかまいませんが、Cの場合はコンパイルエラーになります。今回の問題は、まさにそこにあります。
No.7
- 回答日時:
本題とは関係ありませんが, gcc はわりと柔軟なので「ヘッダファイルを与える」くらいではこけたりしません>#5. 実際, 今の例でもちゃんと動きます (実験済み).
もちろん「他の処理系」のことを念頭に置くと「ヘッダファイルは与えない方がよい」のは事実ですが.
No.4
- 回答日時:
これでどうでしょうか
<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);
}
No.3
- 回答日時:
書き換えてダメだったときには, 「このように書き換えたんだけど」とプログラムを出すようにしてください. わざわざ秘密にして他人に当てさせる必要性なんて, 微塵もないはずだよね.
さておき, #2 の「typedef するのをやめる」というのは, 「単純に typedef を消す」という意味ではありません. 「SY に typedef するのをやめて, 構造体の宣言だけをする」という意味です.
どうもすいませんでした。で、defy.hを以下のように修正した結果、
コンパイル通りました。
#if !defined(__SY)
#define __SY
#include "defx.h"
struct __sy {
int c;
SX d;
};
#endif
No.2
- 回答日時:
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
No.1
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 学校 Syくん「お前と話してるとムカムカする!」 sH「お前の家なんて行きたくない」 言われました。 皆様 3 2022/09/11 16:05
- その他(言語学・言語) @savia:ank saudara sy jg gitu, setelah operasi jd 1 2022/03/23 11:59
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Mac OS MacBook Proのディスクユーティリティの復元について教えてください。このようになってるのです 1 2023/03/15 20:21
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) cryptcatのビルド 4 2022/07/21 14:55
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual C++ ヘッダー情報の反映
-
math.h
-
LinuxC++ファイルWindowsでのmake
-
” OS ビルド ” の意味が分か...
-
enumをintとして扱う必要がある...
-
相互に参照する構造体について
-
gccのコンパイルについて
-
定義位置を表示が出来ない?
-
アイコンについて
-
便利なライブラリorテクニック
-
OpenGLがVC++で使えません・・・。
-
LoadLibraryについて
-
C/C++
-
H8マイコンによるIRQ0割り込み...
-
Visual C++ 2005 Express Edito...
-
C言語の自作関数について
-
gcc で シフトJISを通す方法を...
-
bccでwinmm.libをリンクする方...
-
C/C++ ユーザ定義ヘッダのイン...
-
clでのコンパイル結果を取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
Makefile作成時の拡張子.oとは?
-
外部シンボル "_main"は未解決です
-
<math.h>があるのにsqrtが・...
-
ILSpyで、デコンパイルできない。
-
クリティカルエラー Expressio...
-
【VC++6.0(MFC)】警告「LINK : ...
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
複数のサブディレクトリを一緒...
-
C言語のコンパイルができません
-
PRO*C コンパイルエラー
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルエラー:ユーザ定義...
-
プリコンパイルエラーについて
おすすめ情報