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

rv6*_*rv6 3 c++ linker global-variables extern

对C++来说还是比较新的

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

namespace blah {
    const std::string x="foo";
}
Run Code Online (Sandbox Code Playgroud)

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

namespace blah {
    extern std::string x;
} 
Run Code Online (Sandbox Code Playgroud)

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

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

Naw*_*waz 7

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

//blah.h
namespace blah {
   extern std::string x; //declaration
}
Run Code Online (Sandbox Code Playgroud)

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

//blah.cpp
#include "blah.h"
namespace blah {
    std::string x="foo"; //definition
}
Run Code Online (Sandbox Code Playgroud)

现在包含blah.h尽可能多的文件.您不会看到任何重定义错误.

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