2011-05-25 63 views
0

比较。我正在使用头文件的命名空间下命名空间可变

namespace MyNameSpace 
{ 
    extern string data; 
}; 

而且在实现文件的下。

namespace MyNameSpace 
{ 
     string data = "Data"; 
}; 

然后在我的代码的某些点我比较下。

string mData = "Data"; 

if(mData == MyNameSpace::data) 
{ 
    //do something 
} 

但是,当我比较它不会在段。这可能是什么原因。

问候, 列宁

+0

我假设你的if语句在if语句中实际上有一个double-equals,对吧? – SirPentor 2011-05-25 06:32:20

+0

所以你有==,仍然有问题?或者那是它? – 2011-05-25 06:38:07

+0

@iSight:常量应该是'const'限定的......你确定数据在比较发生的地方有效吗? – 2011-05-25 06:40:11

回答

0

我无法确定这是否会导致您的特定问题,因为我不知道其余的代码。但是,应该肯定反正适用:

Google C++ Style Guide

类类型的静态或全局变量是被禁止的:它们会导致难以发现的错误,由于建设和毁灭的不确定的顺序。包含全局变量,静态变量,静态类成员变量和函数静态变量的静态存储持续时间的对象必须是普通旧数据(POD):仅限整数,字符,浮点数或指针或POD的数组/结构。

调用静态变量的类构造函数和初始化函数的顺序仅在C++中部分指定,甚至可能会从构建变为构建,这可能会导致难以找到的错误。因此,除了禁止类类型的全局变量外,我们不允许使用函数的结果初始化静态POD变量,除非该函数(如getenv()或getpid())本身不依赖于其他全局变量。

同样,调用析构函数的顺序被定义为调用构造函数顺序的相反方向。由于构造函数的顺序是不确定的,因此析构函数的顺序也是如此。例如,在程序结束时,一个静态变量可能已被销毁,但仍在运行的代码(可能在另一个线程中)尝试访问它并失败。或者,静态'string'变量的析构函数可能会在析构函数之前运行,其中包含对该字符串的引用的另一个变量。

因此,我们只允许静态变量包含POD数据。此规则完全禁止使用vector(使用C数组)或string(使用const char [])。

如果您需要类类型的静态变量或全局变量,请考虑从main()函数或pthread_once()初始化指针(永远不会释放该指针)。请注意,这必须是一个原始指针,而不是一个“智能”指针,因为智能指针的析构函数将具有我们试图避免的析构函数问题。

长话短说:永远不要使用“字符串”类型的constannts。你可能想要使用类似于

const char data[] = "Data"; 
0

你有一个= 这是赋值运算符。

需要MDATA == myNameSpace对象::数据

随着MDATA = myNameSpace对象::数据 表达式的值,比不同为零(它是其中的“数据”被存储在地址) 所以它是真(与零不同的东西都被视为真)。

编辑: 如果使用gcc编译,像-Wall这样的标志可能会帮助您找到这类错误/错误。

0

您能否给我们一个小问题的可编辑例子。你发布的代码很好,最有可能的是,这两个变量中的一个并不包含你认为它所做的事情。