c ++:如何访问同一命名空间中但定义在不同文件中的变量?

c++: how to access variables in the same namespace but defined in a different file?

考虑以下两个文件:

a.cpp:

#include <string>
namespace a
{
    const std::string str = "something";
}

b.cpp:

#include <iostream>
#include <string>

namespace a
{
    extern const std::string str;
}


int main(int argc, char **argv)
{
    std::cout << a::str;
    return 0;
}

当我编译它们时,因此(Fedora 30,gcc 9.2.1):

g++ a.cpp b.cpp -o a

我收到链接器错误:

/usr/bin/ld: /tmp/ccEtAgEb.o: in function `main':
b.cpp:(.text+0x10): undefined reference to `a::str[abi:cxx11]'
collect2: error: ld returned 1 exit status

谁能告诉我原因,以及如何解决?我想避免在头文件中引用 a::str,因为它不是 public 接口的一部分,而是我命名空间中的私有变量。

const std::string str = "something";

应该是

extern const std::string str = "something";

const 命名空间范围内的合格对象具有额外的 属性 对其名称施加内部链接。您的原始代码与

相同
static const std::string str = "something";

尝试将#include "a.cpp" 添加到 b.cpp 中。 那么你的代码将是正确的,在 b 中有 extern 定义,在 a 中有实现。