【问题标题】:undefined reference for the extern variable in C++ header [duplicate]C ++标头中外部变量的未定义引用[重复]
【发布时间】:2015-05-05 09:47:04
【问题描述】:

我有一些 C++ 代码:

// A.h
extern const char *names[3];

// B.cpp
#include "A.h"
const char *names[3] = {

   "Name1",
   "Name2"
   "Name3"
};

void getName()
{
    char *name;
    strncpy(name, names[0], 5);
};

// C.cpp
#include "A.h"

然后当我构建它时,它会产生以下错误:

对“名称”的未定义引用 是什么原因以及如何解决?

【问题讨论】:

  • 可以粘贴构建链吗?
  • 它适合我。顺便说一句,您正在对未分配的缓冲区执行strncpy。错了,你应该先分配一些缓冲区。
  • 你的真实代码是不是“B.cpp”中的分号也太多了?

标签: c++ arrays header extern


【解决方案1】:

您提供的示例中有一些错误,我假设您不只是复制/粘贴源代码。就像const char *names[3]; = { 行中的分号,或者“Name2”旁边的字符串列表中缺少的逗号

那么关于你的问题。您不应该在 B.cpp 中包含 A.h,我的意思是应该删除行 #include "A.h"。您包含头文件,并且仅在您将在其他 cpp 文件中使用 *names 指针的地方使用 extern 关键字。

【讨论】:

  • 是的,这部分“const char *names[3]; =”,我在问题部分改了
【解决方案2】:

B.cpp 不应包含A.h 没有必要。 A.h 中的 extern 是一个声明,它为链接器设置了一个期望,即全局变量可以在另一个要链接的目标文件中找到,但 B.cpp 是变量所在的位置定义

只需确保在链接时同时链接 A.cppB.cpp

【讨论】:

  • 包含标头可确保在编译时报告声明中的任何不匹配,这似乎很有用。
  • 点了。由于上述原因,我一直避免使用它,因为如果您声明 extern 并在同一个编译单元中定义它似乎有点误导,但我知道您来自哪里。
猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 2013-10-17
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多