共享命名空间中的变量时,c ++重复符号链接器错误

时间:2011-09-15 17:24:17

标签: c++ linker global-variables extern

C ++仍然相对较新

我有一个带有命名空间的头部变量,其中有几个常量看起来像这样

namespace blah {
    const std::string x="foo";
}

我以这种方式访问​​变量没有问题 - dosomething(blah :: x);现在我想更改变量,以便可以修改它。如果我只取出const我得到一个链接器错误“duplicate symbol blah :: x”。在这里添加extern无济于事:

namespace blah {
    extern std::string x;
} 

它表示默认情况下启用了extern,我得到相同的重复符号错误。什么是正确的方法呢?

(在后一种情况下编辑,我不想设置变量值。我想在别处派生它并分享值。澄清 - 我想摆脱const所以我可以改变值(例如,使用命令行参数。当我摆脱const时,我得到关于重复符号的错误。)

3 个答案:

答案 0 :(得分:7)

在头文件中,您应该声明变量:

//blah.h
namespace blah {
   extern std::string x; //declaration
}

在源文件中,您应定义为:

//blah.cpp
#include "blah.h"
namespace blah {
    std::string x="foo"; //definition
}

现在将blah.h包含在您想要的任意数量的文件中。您不会看到任何重定义错误。

如果你想摆脱const(正如你在评论中所说的那样),那么就像我一样删除它。

答案 1 :(得分:2)

在头文件中声明extern

code.h

namespace blah {
  extern std::string x;
};

...并在单个CPP文件中定义 ...

code.cpp

std::string blah::x = "foo";

答案 2 :(得分:0)

创建一个声明你的extern的头文件:

namespace blah {
    extern std::string x;
} 

然后创建一个包含定义的源文件:

namespace blah {
    std::string x="foo";
} 

这样定义在lib(你将链接)中编译一次,并且不会多次定义(包括头部的任何地方)。