不了解静态布尔行为
Don't understand static boolean behavior
我有一个头文件,其中有一些静态变量供我所有的文件使用。这里有一个布尔变量初始化为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的值,它说它是真的。但是当我在上面发布的if语句中检查它是否为真时,read_mess又回到了假。为什么会发生这种情况?我相信这只是简单的东西,但我似乎不能使它工作。每次执行UTILITY_H::时,是否都重新初始化了utility.h中的所有变量?如果是,为什么?
static
在此上下文中表示"local"(对于翻译单元)。在您的程序中将有多个read_mess
副本,每个翻译单元一个,它是而不是,与头文件相同。(在您的情况下,您很可能将"翻译单元"近似为。cpp或。c或。cc文件)。
可能你想做的是声明一个extern
变量,或static
类成员和定义它在一个翻译单元。
在实践中使用extern
意味着在你的头文件中你想写:
extern bool read_mess;
但是在中只有一个不是标题的地方:
bool read_mess = false;
static
全局变量是每个。c或。cpp文件(或翻译单元)的私有变量。如果你打印出read_mess
的地址(例如,printf("%x", &read_mess);
),你会看到不同的地址,这意味着存在两个独立的布尔变量副本。
一个解决方案是删除static
关键字,或替换为extern
。并且,在任何.c或.cpp文件中只放置该变量的定义一次。
当您在头文件中声明静态变量时,将在包含该文件的每个翻译单元(头文件+源文件)中创建该静态变量的副本。
您正在检查静态变量的值,该变量是为该翻译单元定义的副本,它与您在另一个翻译单元中初始化的值不同。
如果您希望跨不同文件访问变量,最好使用extern
。
utility.h -将此包含在您想要访问read_mess
的所有文件中
extern bool read_mess;
File1.cpp -在一个源文件中定义read_mess
#include"utility.h"
bool read_mess = false;
File2.cpp -在任何源文件中访问read_mess
#include "utility.h"
if(read_mess)
{
//do what interests you
}
,
c++ 03标准:7.3.1.1/2说:
在命名空间范围内声明对象时不建议使用static关键字,unnamed-namespace提供了一个更好的选择。
- 从命令行c++发送文本文件名
- 使用新行和不使用新行读取文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 预处理器:插入结构名称中的前一个行号
- 确保静态布尔检查的线程安全
- 将静态库链接行添加到我的QT项目文件没有区别
- 在命令行程序中使用布尔值。找不到定义标志并检查它们是否在参数中的方法
- C++中的静态布尔函数
- 枚举静态转换为布尔,编译器发出性能警告
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 是否可以在命令行上使用 visual-c++ 静态链接特定库
- C++ 解析命令行参数和布尔值
- 避免使用静态布尔值上的if语句进行逻辑决策
- 在布尔矩阵中查找唯一的行(帮助解析std::string的垃圾输出)
- 访问其他类中的静态方法和静态布尔值
- 使用Objective-C/C静态库进行c++命令行工具项目
- 不了解静态布尔行为
- 如何添加静态链接运行时程序集
- 将静态 2D 数组的行分配给另一行