与命名空间变量比较

时间:2011-05-25 06:27:37

标签: c++ namespaces

我在头文件中使用命名空间,如

namespace MyNameSpace
{
    extern string data;
};

并在实现文件中。

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

然后在我的代码的某些方面,我正在进行比较。

string mData = "Data";

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

但是,当我比较它不会进入细分市场。可能是什么原因。

此致 列宁

3 个答案:

答案 0 :(得分:0)

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

您需要mData == MyNameSpace :: data

使用mData = MyNameSpace :: data 表达式的值不等于零(它是存储“数据”的地址) 所以它是真的(不同于零的一切都被视为真)。

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

答案 1 :(得分:0)

你能否给我们一个小问题的可编辑的例子。你发布的代码很好;最有可能的是,这两个变量中的一个不包含您的想法。

答案 2 :(得分:0)

我无法肯定地确定这会导致您的特定问题,因为我不知道其余的代码。但是,无论如何它应该明确适用:

来自Google C++ Style Guide

  

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

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

     

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

     

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

     

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

长话短说:永远不应该使用“字符串”类型的参与者。您可能想要使用类似

的内容
const char data[] = "Data";