在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型

Posted

技术标签:

【中文标题】在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型【英文标题】:Undefined reference when using extern on a c++ object, but not integral type 【发布时间】:2012-10-03 02:24:53 【问题描述】:

尝试在 c++ 对象上使用 extern 时出现未定义的引用错误。整数类型似乎不会发生这种情况。我错过了什么?!下面的代码复制了这个问题:

file1.cpp:

#include <string>

const std::string s("test");
int i = 99;

int main()

        extern void Test();
        Test();

file2.cpp:

#include <iostream>
#include <string>

extern const std::string s;
extern int i;

void Test()

        std::cout << s << std::endl;
        std::cout << i << std::endl;

如果我注释掉 's' std::string 变量的用法,链接错误就会消失。

SO 上还有其他类似的问题,但它们似乎都与没有定义变量的人有关,我就是!

【问题讨论】:

【参考方案1】:

它是std::string 上的const,它提供s 内部链接。引用自【3.5 程序与链接】:3:

具有命名空间范围 (3.3.6) 的名称具有内部链接,如果它是 名字

——显式声明为 const 或 constexpr 的变量,并且 既没有明确声明 extern 也没有事先声明有 外部链接;或

【讨论】:

【参考方案2】:

如果去掉 const,它可以在 vc++ 中工作,如果你将它们都定义为 extern const,它也可以工作。

// file1.cpp
extern const std::string s("test");
extern const int i = 99;

// file2.cpp
extern const std::string s;
extern const int i;

如果您从 file1.cpp 中删除任何“extern”,它就无法编译。如果变量定义为 const,您可以从 file1.cpp 中删除 'extern'。

【讨论】:

以上是关于在 c++ 对象上使用 extern 时未定义的引用,但不是整数类型的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 boost:regex_error 时未定义符号?

c++ 全局对象

为 f2py 使用 C++ 源时未定义的符号

裸机嵌入式 C++:将闪存写入 ram 时未定义对 memcpy 和 memset 的引用

尝试使用 useContext() 获取对象时未定义对象

C++中如何定义变量