

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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visualstudio C# テキストボッ...
-
C++の分割コンパイルについて
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
変数の型を定義しなかった場合...
-
DDVによるメッセージの変更
-
main.c:7:43: warning: implici...
-
C言語 宣言した変数になにも代...
-
int void (main)の意味・・・
-
構造体を生成時にわざわざ初期...
-
sshdログの意味
-
void func( void )について
-
intとINTの違いは?
-
C言語の課題について
-
c++からdll内の関数を呼ぶ記述...
-
inline
-
関数の実体定義にヘッダファイ...
-
64bit → 32bit型へのキャスト
-
戻り値の型??
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
2重定義って??
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
ハンドルされていない例外が発...
-
void func( void )について
-
C言語のコンパイルエラー
-
enumについて
-
関数の実体定義にヘッダファイ...
-
C言語 宣言した変数になにも代...
-
C++ クラスをメンバにもつクラ...
-
プログラムの中で別のmainを呼...
-
sshdログの意味
おすすめ情報