web-dev-qa-db-ja.com

C ++グローバル変数宣言


私がしたいのは、ヘッダーファイルに変数を定義し、そのヘッダーをインクルードするたびにその変数を再定義せずに2つの異なるcppファイルで使用することです
これが私が試した方法です:

Variables.h

#ifndef VARIABLES_H // header guards
#define VARIABLES_H

static bool bShouldRegister;

#endif

(externも試しましたが、何も変わりませんでした)

そして、cppファイルでは、::bShouldRegister = trueまたはbShouldRegister = true;の値を指定します

私の別のcppファイルでは、スレッドを作成してその値をチェックし、ループでその値をチェックします(そして、はい、私のスレッド関数はうまく機能します)

 while (true)
 {
     if (::bShouldRegister) // Or if (bShouldRegister)
        {
            MessageBox(NULL,"Value Changed","Done",MB_OK|MB_ICONINFORMATION);
        }
  Sleep(100);
 }

はい、そのMessageBoxは表示されません(bShouldRegisterがtrueになることはありません:/)

31
Shahriyar

externを使用する必要があります。それ以外の場合は、おそらく異なる値を持つ各翻訳単位に別個のbShouldRegisterがあります。

これをヘッダーファイル(.h)に入れます。

extern bool bShouldRegister;

これを実装ファイル(.cpp)の1つに入れます。

bool bShouldRegister;
51
deepmax

さらにC++に似た方法は、staticキーワードで構文的に示されるクラスメンバーを使用することです。クラスメンバー変数には、暗黙的なexternalリンケージがあります。

#ifndef VARIABLES_H
#define VARIABLES_H

class RegUtil {
public:

    static bool bShouldRegister;

};

#endif

cppファイルの1つ(おそらくvariables.cpp)、このクラスメンバーを定義する必要があります。

#include "variables.h"

bool RegUtil::bShouldRegister;
18
Wolf

モジュールのいずれかで変数を定義する必要があります。

bool bShouldRegister;

次に、ヘッダーでexternstaticではなく)を宣言します。

extern bool bShouldRegister;
9
Fred Foo

C++ 17を使用できる場合は、インライン変数の使用を検討してください。

// in a header file
inline bool bShouldRegister = true;

詳細については、 インライン変数の仕組み を参照してください。

6
bcd