• ベストアンサー

ヘッダファイルと構造体

typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

貴方は「Point型の定義」は行っていますが「Point構造体の定義」は行っていません。 例1 typedef struct{ float x; float y; float z; }Point; /* ←これは構造体名ではなく、型名 */ typedef struct { Point p1; /* 型名でメンバを定義 */ Point p2; /* 型名でメンバを定義 */ }Rect; 例2 struct tagPoint { /* ←tagPointは構造体名 */ float x; float y; float z; } typedef struct tagPoint Point; /* ←Pointは構造体名ではなく、型名 */ struct tagRect { Point p1; /* 型名でメンバを定義 */ struct tagPoint p2; /* 構造体名でメンバを定義 */ }; typedef struct tagRect Rect; 因みに「Point」や「Rect」は、Windows GUI環境では「画面などの2Dのデバイスコンテキストの操作用に、既に定義済み」なので、別の名前を使用した方が良いでしょう。「MyPoint」や「MyRect」などのように。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

typedefしたものは、型名なので、 Point p1; Point P2; のように書きます。 structのタグ名を使った書き方と混同してるのでしょう。 参考: typedef struct { float x; } a; a p1; struct aa { float x; }; struct aa p2;

doora88
質問者

補足

回答ありがとうございます えと、p1,p2には.cのプログラムでxyzの関数の座標がはいるのです。 もし、ヘッダファイルの内容を.cのほうに書くと typedef struct{ float x; float y; float z; }Point; struct Rect{ struct Point p1; struct Point p2; }; これをヘッダファイルに記述したいのですが、先ほど述べたとおり struct Point p1; struct Point p2; のPointが未定義の構造体になるのです。 説明不足ですいません

関連するQ&A