1. ホーム
  2. c++

[解決済み] 静的なブーリアン動作が理解できない

2022-02-19 09:42:21

質問

ヘッダーファイルには、すべてのファイルが使用する静的変数があります。その中に、0に初期化されたブーリアン変数があります。

//in utility.h
static bool read_mess = false;

コマンドライン引数に --view-read-messages がある場合に true に変更し、クライアントからメッセージを受け取ったときに次のようなことをできるようにしたい -。

//code from a different file
if(UTILITY_H::read_mess)
    std::cout<<"\nMessage successfully received from Client 2: "<<in2;

mainでは、コマンドライン引数をチェックし、変数read_messをtrueに設定しています -。

//this is in a for, where temp is the command line arg[i]
else if(strcmp(temp.c_str(), "--view-read-messages") == 0) {
    UTILITY_H::read_mess = true;
}

mainのこの行の後にread_messの値を表示させると、trueと表示されます。しかし、私が上に投稿したifステートメントでその真偽をチェックしているとき、read_messはfalseに戻っています。なぜこのようなことが起こるのでしょうか?きっと簡単なことだと思うのですが、どうしてもうまくいきません。UTILITY_H:: を実行するたびに utility.h のすべての変数が再初期化されるのでしょうか?もしそうなら、なぜですか?

解決方法は?

static この文脈では、quot;local" (翻訳ユニットに対して)を意味します。のコピーは複数存在します。 read_mess である翻訳単位ごとに1つずつ、プログラム内に存在します。 ではなく ヘッダーファイルと同じものです。(あなたの場合、quot;translation unit" を .cpp または .c または .cc ファイルと近似させることができます)。

おそらく、あなたがやろうとしたことは 宣言 アン extern 変数、または static クラスメンバー 定義 を1つの翻訳ユニットで実現しました。

実際には extern というのは、ヘッダーファイルの中で書きたいことを意味します。

extern bool read_mess;

しかし 唯一無二の は、ヘッダーではない他の場所です。

bool read_mess = false;