【问题标题】:Extern keyword and unresolved external symbolsextern 关键字和未解析的外部符号
【发布时间】:2008-12-27 14:52:03
【问题描述】:

我用颜料画了一个小图来解释我的问题:

但是我发帖后使用<img>标签时好像没有出现?

图表:

【问题讨论】:

  • 如您所见,代码比图片简单。将您的代码缩减到显示您的问题的绝对最少的行。发布那些。图片不如精简到基本问题的代码 sn-ps 准确。
  • 那张照片告诉我们什么

标签: c++ symbols extern


【解决方案1】:

问题是db的声明范围。代码:

extern Database db;

真正的意思是“db 被声明为全局某处,只是不在这里”。然后代码不会继续并实际在全局范围内声明它,而是在 main() 中本地声明,这在 main() 之外是不可见的。代码应如下所示,以解决您的链接问题:

file1.c

Database db;
int main ()
{
  ...
}

文件2.c

extern Database db;
void some_function ()
{
  ...
}

【讨论】:

  • 就是这样。 “[some var] 在某处全局声明,只是不在此处”。关于 extern 关键字的所有其他答案都没有这种解释。非常感谢!
【解决方案2】:

您需要在 main() 之外实例化数据库,否则您将只声明一个局部变量来映射全局变量。

GameServer.cpp:

#include GameSocket.h
Database db(1, 2, 3);
int main() {
   //whatever
}

【讨论】:

  • 次要问题,但它不会影响全局,因为没有全局 - 只是对不存在的引用的引用。
【解决方案3】:

extern 应用于所有 CPP(以及生成的 OBJ)文件,因此它们都没有实际实例化 DB。

这是解决此问题的一种方法。在 Database.h 中,将 extern Database db 更改为:

#ifdef INSTANTIATE_DB
Database db;
#else
extern Database db;
#endif

然后在您的一个 CPP 文件中(如果有的话,Database.cpp 会很好)在 #include "Database.h" 之前添加一个 #define INSTANTIATE_DB

【讨论】:

  • 你可以那样做,但不是特别干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多