長くなったプログラムを整理するために
a.cppと、b.cpp、a.hというように複数ファイルに分けて編集していたのですが
a.cppとb.cppの両方で、a.hをインクルードすると、リンク時に
「"int x" はすでに定義されています」
というようなエラーが出てしまいます。
変数が全て二重に定義されているというエラーのようなのですが
ifndef〜endifのような、二重定義防止を用いてもエラーは解決できませんでした。
このエラーの解決は、どのようにしたらいいのでしょうか?
定義は一度の原則を守ることです。
また,ヘッダファイルにおいてオブジェクトの定義をしないことです。
externを調べてみるとよいでしょう。
宣言と定義の違いを調べてみることです。
そう! この問題はメーカ系のプログラマでもこーゆーヘッダを作る人多いので、是非汎用性の有るヘッダファイル作りを習慣付けして下さい。
原則として、CベースでもC++ベースでもヘッダでは「実体を持たせない」。これが大事です。
特に、Cベースの時は実体を持つソースに対応する外部宣言ヘッダを作ってやる様に心がけると良いと思います。(各ソースを纏めたヘッダを作ると汎用性が低下する)但し、グローバル変数の外部宣言は極力減らす方向で・・・(理想は関数の外部宣言のみ)
それと参考までに、#ifndef とかで判断すべきは #define がされてるかどうかであって、変数が定義済みかどうかの制御は出来ません。
しかし、「ヘッダでは実体を持たない」って原則を守れば、変数の2重定義なんてエラーも無くなる筈です。
もっとも、#define も #ifndef をズラズラ書くのもソースが見づらいので、極力局所的にソース内記述をする様に心がけると良いと思います。(ヘッダでは本当に共通で用いるべきエイリアスを絞り込む)
C++のクラス定義はどうしようもないので、二重include防止は必要ですけどね…
ツイート | ![]() |