No.3ベストアンサー
- 回答日時:
ヘッダファイルの2重読み込みではなく、ヘッダファイルで(宣言でなく)定義をしてしまったというケースでしたか。
この場合、2つの方法があります。
1.ヘッダファイルでは宣言だけを行い、ひとつの実行ファイル(のみ)で定義を行う
------- test.h ------
namespace TEST_SAPCE
{
extern int d; // ここは宣言
extern short h;
}
------- test.cpp -------
#include "test.h"
int TEST_SAPCE::d; // ここで定義
short TEST_SAPCE::h;
int main()
{
TEST_SAPCE::d = 1;
TEST_SAPCE::h = 0;
return 0;
}
------- sub.cpp -------
#include "test.h"
void sub()
{
TEST_SAPCE::d = 1;
TEST_SAPCE::h = 0;
}
2.インクルードファイルでマクロを使い、定義と宣言を切り分ける方法
------- test.h ------
#if defined(GLOBAL_HERE)
#define GLOBAL
#define init(x) = (x)
#else
#define GLOBAL extern
#define init(x)
namespace TEST_SAPCE
{
GLOBAL int d;
GLOBAL short h init(10);
}
------- test.cpp -----
// ひとつの実行ファイルだけ、test.h をinclude する前に、GLOBAL_HERE を定義する
#define GLOBAL_HERE
#inlcude "test.h"
int main()
{
TEST_SAPCE::d = 1;
TEST_SAPCE::h = 0;
return 0;
}
------- sub.cpp -------
#include "test.h"
void sub()
{
TEST_SAPCE::d = 1;
TEST_SAPCE::h = 0;
}
なるほど、#defineを使ってソースファイルで定義することにより一度しか読み込まなくなるんですね。 それで重複定義を防げると。
大変参考になりました。
No.6
- 回答日時:
Visual C++限定で良いのであれば、
namespace Test
{
__declspec(selectany) int g_variableName;
}
のようにしてしまえばインスタンス生成が1回だけ行なわれるようになるので、ヘッダに宣言(Declaration)と定義(Definition)をまとめて記述できちゃいますが、それ以外のコンパイラの場合は他の回答者の方々が例示してらっしゃるように、ヘッダ側に宣言を記述(公開)して、ソースファイル側に実体を定義(実装)するようにします。
ただC++ではグローバル変数なんぞ使わないほうが無難です。
最悪でもstaticメンバーを使ってシングルトン実装にするのが定石かと。
ちなみに変数でなくconstを付けた定数であれば、C++の場合デフォルトで内部リンケージなので、ヘッダでも宣言と定義を記述できるようになっています。これにより、C言語でよく使われていたマクロ定数がほとんどの場面で不要になります。
namespace Test
{
const double PI = 3.141592653589793238;
}
No.5
- 回答日時:
既に答は出てるから蛇足だけど, 名前空間内だからといって特別なことはないんだよね.
ヘッダで
int x;
とかやったらダメというのはいいよね? namespace で囲まれてるけど, 基本的にはこれと同じこと.
無名名前空間だとヘッダで定義しても二重定義にならないから話は違うけど, それで何を期待するのかはやっぱりわからん.
No.2
- 回答日時:
何を言っているのかわかりません.
具体的かつ簡単な例は出せませんか?
この回答への補足
簡単な例は、
//============TEST.H==========//
#pragma once
namespace TEST_SAPCE
{
int d;
short h;
}
//============DOODLE.H(TEST.Hを使うヘッダー)==========//
#include "TEST.h"
~ 以下略 ~
//========MAIN.CPP=======//
#inlcude "DOODLE.h"
int main()
{
int c;
}
No.1
- 回答日時:
おそらくは、namespace が問題というより、単に、インクルードファイルの2十四見込みが発生しているだけという気がしますが。
この場合、インクルードガードと呼ばれる手法があります。
マイクロソフトの処理系だと、ヘッダファイルの先頭に
#pragma once
と書くだけです。
汎用的な方法としては、ヘッダファイルの先頭に
#if !defined(ABCDEF)
#define ABCDEF
と書き、ヘッダファイルの最後に
#endif
を置く方法があります。
上の例で書いた、ABCDEF は、それぞれのヘッダファイルで一意になる名前(たとえば、プロジェクト名+ヘッダファイル名など)です。
このファイルが読み込まれた場合、最初は、(上の例では) ABCDEF が定義されていないので、ABCDEF を定義した上で、ヘッダファイル全体が有効になります。
2度目以降に読み込まれたとき、すでに ABCDEF が定義されているので、#if !defined() という条件に一致しなくなり、これ以降 #endif までがなかったことになります。
ちなみにエラーはLNK2005です
下記はERROR出力です
error LNK2005: "int TEST::d" (?d@TEST@@3HA) は既に XXXXX.obj で定義されています。
ヘッダーにはnamespaceで実体を定義するのはまずいみたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Windows 10 windowsの回復ドライブや復元ポイントを使用した場合の戻る位置を教えてください。 5 2023/08/19 14:52
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- 日本語 複合名詞(造語)について教えて欲しいです 2 2022/05/22 17:14
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- ノートパソコン 教えて下さい。過去のエクセルのファイルデータの中に、ヘッダーのところに図形を登録しています。 今回新 4 2023/04/11 15:16
- JavaScript 条件に該当した時のみ定数を宣言する事はできますか 8 2023/03/15 05:55
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
2重定義って??
-
DLLでLIBファイルが作成されない
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
警告 ”値が割り当てられていな...
-
ハンドルされていない例外が発...
-
main.c:7:43: warning: implici...
-
C言語で戻り値を使った正方形の...
-
GCCで暗黙の型変換の警告を出し...
-
namespace定義の使い方
-
プログラムの中で別のmainを呼...
-
構造体のあるメンバを基準にソ...
-
512Lや1024L等の「L」について
-
intとINTの違いは?
-
DDVによるメッセージの変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
プログラムの中で別のmainを呼...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
エラー「invalid conversion fr...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
void func( void )について
-
sshdログの意味
-
C言語での方向キー入力判定
おすすめ情報