• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語での構造体の定義と初期化)

C言語での構造体の定義と初期化

このQ&Aのポイント
  • C言語での構造体の定義と初期化について質問させてください。
  • コンパイラが各オブジェクトをコンパイルしているときに警告が発生し、どうやっても解消しません。
  • 警告の原因と対処について、どなたかアドバイスをお願いします。

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

  • ベストアンサー
回答No.2

本当にCの範囲でなければならないというのなら、アウトですが、C++なら構造体もコンストラクタを持つことができます(構造体でもコンストラクタでしたっけ?) 確かに、「定義と初期化」は同時にできます。 が、「定義」というのは、実体を伴うので、初期化しているというのはそこで実体を定義していることにもなります。 同じ「実体」を複数の場所で定義するのはアウトです。 C++の場合は、 struct st_split_path{ char drive [MAX_FULLPATH];//ドライブ名 char dirpath[MAX_FULLPATH];//ディレクトリパス char dir [MAX_FULLPATH];//直属のディレクトリ名 char fname [MAX_FULLPATH];//ファイル名 char fname2 [MAX_FULLPATH];//ファイル名(拡張子抜き) char ext [MAX_FULLPATH];//拡張子(ドットつき) int buffsize; st_split_path() { *drive = '\0'; *dirpath = '\0'; *dir = '\0'; *fname = '\0'; *fname2 = '\0'; *ext = '\0'; } }; でOK。

kolona
質問者

お礼

早速の回答ありがとうございます。 > 本当にCの範囲でなければならないというのなら、アウト これは、「構造体の定義と初期化は同時にできるが、これにより実体となるため、共用のヘッダファイルでやろうとしている時点でアウト。やるなら関数ごとに別名ですべし。」という理解でよろしいでしょうか。 これを前提として、Cスタンダードな宣言時の{ }を使った初期化をすることにしました。 もともと初期化忘れのようなケアレスミスが減るといいなぁ・・・と考えて実験していたので、そもそもミスしないよう関数設計で気をつけよう、という教訓になりそうです。 C++ ・・・便利ですね。 C++、ちょろっとだけ、文法の半分くらいを勉強したことはあるんですが、まだまだ理解に至らぬまま、C++0Xなんて出てしまって圧倒されている状況です。 自分のレベルが上がったら、使ってみたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

typedefは型の別名を付けるだけで、初期化は関係ないです。 それに struct st_split_path{ 略 } st_split_path = {初期値} だと「sturcut st_split_path 型の『変数 st_split_path』 の宣言と初期化」になります。 構造体使用時のデフォルトの初期値、という効果はありません。 結果、st_split_pathという名前の変数が、ヘッダを通して複数のオブジェクトファイルに存在することになるので、多重定義でエラーになってます。

kolona
質問者

お礼

> 「sturcut st_split_path 型の『変数 st_split_path』 の宣言と初期化」になります。 ああっ完全に勘違い・・・typedefしてないんだから型名じゃないですもんね・・・ 構造体型のデフォルト初期化はどうもできそうにないので、ちゃんと関数内で初期化することにしました。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A