私がしたいのは、ヘッダーファイルに変数を定義し、そのヘッダーをインクルードするたびにその変数を再定義せずに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になることはありません:/)
extern
を使用する必要があります。それ以外の場合は、おそらく異なる値を持つ各翻訳単位に別個のbShouldRegister
があります。
これをヘッダーファイル(.h)に入れます。
extern bool bShouldRegister;
これを実装ファイル(.cpp)の1つに入れます。
bool bShouldRegister;
さらに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;
モジュールのいずれかで変数を定義する必要があります。
bool bShouldRegister;
次に、ヘッダーでextern
(static
ではなく)を宣言します。
extern bool bShouldRegister;
C++ 17を使用できる場合は、インライン変数の使用を検討してください。
// in a header file
inline bool bShouldRegister = true;
詳細については、 インライン変数の仕組み を参照してください。