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 中有实现。
考虑以下两个文件:
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 中有实现。