我在头文件中使用命名空间,如
namespace MyNameSpace
{
extern string data;
};
并在实现文件中。
namespace MyNameSpace
{
string data = "Data";
};
然后在我的代码的某些方面,我正在进行比较。
string mData = "Data";
if(mData == MyNameSpace::data)
{
//do something
}
但是,当我比较它不会进入细分市场。可能是什么原因。
此致 列宁
答案 0 :(得分:0)
你有一个= 那是赋值运算符。
您需要mData == MyNameSpace :: data
使用mData = MyNameSpace :: data 表达式的值不等于零(它是存储“数据”的地址) 所以它是真的(不同于零的一切都被视为真)。
编辑: 如果使用gcc进行编译,像-Wall这样的标志可能会帮助您找到这种错误/错误。
答案 1 :(得分:0)
你能否给我们一个小问题的可编辑的例子。你发布的代码很好;最有可能的是,这两个变量中的一个不包含您的想法。
答案 2 :(得分:0)
我无法肯定地确定这会导致您的特定问题,因为我不知道其余的代码。但是,无论如何它应该明确适用:
禁止类类型的静态或全局变量:由于构造和销毁的不确定顺序,它们会导致难以发现的错误。 具有静态存储持续时间的对象(包括全局变量,静态变量,静态类成员变量和函数静态变量)必须是普通旧数据(POD):仅仅是整数,字符,浮点数或指针,或POD的数组/结构。 / p>
调用静态变量的类构造函数和初始化程序的顺序仅在C ++中部分指定,甚至可以从构建更改为构建,这可能导致难以找到的错误。因此,除了禁止类类型的全局变量之外,我们不允许使用函数的结果初始化静态POD变量,除非该函数(例如getenv()或getpid())本身不依赖于任何其他全局变量
同样,调用析构函数的顺序被定义为与调用构造函数的顺序相反。由于构造函数顺序是不确定的,因此析构函数顺序也是如此。例如,在程序结束时,静态变量可能已被破坏,但仍在运行的代码(可能在另一个线程中)尝试访问它并失败。或者,对于包含对该字符串的引用的另一个变量,可以在析构函数之前运行静态“字符串”变量的析构函数。
因此,我们只允许静态变量包含POD数据。此规则完全禁止向量(使用C数组)或字符串(使用const char [])。
如果需要类类型的静态或全局变量,请考虑从main()函数或pthread_once()初始化指针(永远不会释放)。请注意,这必须是原始指针,而不是“智能”指针,因为智能指针的析构函数将具有我们试图避免的析构函数顺序。
长话短说:永远不应该使用“字符串”类型的参与者。您可能想要使用类似
的内容const char data[] = "Data";