web-dev-qa-db-ja.com

C ++でグローバル変数を宣言する方法

グローバル変数を使用してはならないことは知っていますが、必要です。関数の外部で宣言された変数はすべてグローバル変数であると読みました。私はそうしましたが、別の* .cppファイルでその変数が見つかりませんでした。それで、それは本当にグローバルではありませんでした。ヘッダーファイルGlobalVariabels.hを作成し、そのファイルを使用する他の* cppファイルに含める必要があるのではないでしょうか。

51
Marcus Tik

関数の外部で宣言された変数はすべてグローバル変数であると読みました。私はそうしましたが、別の* .cppファイルでその変数が見つかりませんでした。それで、それは本当にグローバルではありませんでした。

scopeの概念によれば、変数グローバルです。ただし、これまでに読んだ/理解した内容は非常に単純化されています。


可能性1

おそらく、他の変換単位(TU)の変数をdeclareするのを忘れた可能性があります。以下に例を示します。

a.cpp

int x = 5; // declaration and definition of my global variable

b.cpp

// 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にも含まれます。 。


可能性2

さらに、変数に内部リンケージが含まれている可能性があります。これは、翻訳ユニット間で公開されていないことを意味します。変数がconst[C++11: 3.5/3])とマークされている場合、これはデフォルトです。

a.cpp

const int x = 5; // file-`static` by default, because `const`

b.cpp

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.
}

これを修正するには、externdefinitionにも適用します。

a.cpp

extern const int x = 5;

この全体的なマラキーは、TUの境界を越えて機能を表示/使用可能にする混乱とほぼ同等ですが、その実行方法にいくつかの違いがあります。

共通ヘッダーで変数をexternとして宣言します。

//globals.h
extern int x;

そして、それを実装ファイルで定義します。

//globals.cpp
int x = 1337;

その後、アクセスが必要なすべての場所にヘッダーを含めることができます。

変数をnamespace内にラップすることもお勧めします。

52
Luchian Grigore

ここでの他の回答に加えて、値が整数定数である場合、クラスまたは構造体のパブリック列挙型が機能します。名前空間のルートにある変数-定数またはその他-は別のオプションであるか、クラスまたは構造体の静的パブリックメンバーは3番目のオプションです。

MyClass::eSomeConst (enum)
MyNamespace::nSomeValue 
MyStruct::nSomeValue (static) 
4
JTeagle

これが何らかの意味で正しいかどうかはわかりませんが、これは私にとってはうまくいくようです。

someHeader.h
inline int someVar;

私はリンク/複数の定義の問題がなく、それは「うまくいく」... ;-)

「クイック」テストには非常に便利です。グローバル変数を避けるようにしてください。

0
Dariusz