グローバル変数を使用してはならないことは知っていますが、必要です。関数の外部で宣言された変数はすべてグローバル変数であると読みました。私はそうしましたが、別の* .cppファイルでその変数が見つかりませんでした。それで、それは本当にグローバルではありませんでした。ヘッダーファイルGlobalVariabels.hを作成し、そのファイルを使用する他の* cppファイルに含める必要があるのではないでしょうか。
関数の外部で宣言された変数はすべてグローバル変数であると読みました。私はそうしましたが、別の* .cppファイルでその変数が見つかりませんでした。それで、それは本当にグローバルではありませんでした。
scopeの概念によれば、変数はグローバルです。ただし、これまでに読んだ/理解した内容は非常に単純化されています。
おそらく、他の変換単位(TU)の変数をdeclareするのを忘れた可能性があります。以下に例を示します。
int x = 5; // declaration and definition of my global variable
// I want to use `x` here, too.
// But I need b.cpp to know that it exists, first:
extern int x; // declaration (not definition)
void foo() {
cout << x; // OK
}
通常は、ヘッダーファイルにextern int x;
を配置します。ヘッダーファイルは、b.cppに含まれるほか、x
を使用する必要がある他のTUにも含まれます。 。
さらに、変数に内部リンケージが含まれている可能性があります。これは、翻訳ユニット間で公開されていないことを意味します。変数がconst
([C++11: 3.5/3]
)とマークされている場合、これはデフォルトです。
const int x = 5; // file-`static` by default, because `const`
extern const int x; // says there's a `x` that we can use somewhere...
void foo() {
cout << x; // ... but actually there isn't. So, linker error.
}
これを修正するには、extern
をdefinitionにも適用します。
extern const int x = 5;
この全体的なマラキーは、TUの境界を越えて機能を表示/使用可能にする混乱とほぼ同等ですが、その実行方法にいくつかの違いがあります。
共通ヘッダーで変数をextern
として宣言します。
//globals.h
extern int x;
そして、それを実装ファイルで定義します。
//globals.cpp
int x = 1337;
その後、アクセスが必要なすべての場所にヘッダーを含めることができます。
変数をnamespace
内にラップすることもお勧めします。
ここでの他の回答に加えて、値が整数定数である場合、クラスまたは構造体のパブリック列挙型が機能します。名前空間のルートにある変数-定数またはその他-は別のオプションであるか、クラスまたは構造体の静的パブリックメンバーは3番目のオプションです。
MyClass::eSomeConst (enum)
MyNamespace::nSomeValue
MyStruct::nSomeValue (static)
これが何らかの意味で正しいかどうかはわかりませんが、これは私にとってはうまくいくようです。
someHeader.h
inline int someVar;
私はリンク/複数の定義の問題がなく、それは「うまくいく」... ;-)
「クイック」テストには非常に便利です。グローバル変数を避けるようにしてください。