Ключевое слово Extern и неразрешенные внешние символы - PullRequest
2 голосов
/ 27 декабря 2008

Я нарисовал маленький график в краске, который объясняет мою проблему:

Но, кажется, он не отображается, когда я использую тег <img> после публикации?

Graph:

http://i44.tinypic.com/103gcbk.jpg

Ответы [ 3 ]

7 голосов
/ 27 декабря 2008

Проблема в объёме объявления дб. Код:

extern Database db;

действительно означает "db объявлен глобально где-то , только не здесь". Код тогда не идет вперед и фактически объявляет его глобально, но локально внутри main (), который не виден вне main (). Код должен выглядеть следующим образом, чтобы решить вашу проблему со связью:

file1.c

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

file2.c

extern Database db;
void some_function ()
{
  ...
}
3 голосов
/ 27 декабря 2008

Вам нужно создать экземпляр базы данных вне main (), иначе вы просто объявите локальную переменную, скрывающую глобальную.

GameServer.cpp:

#include GameSocket.h
Database db(1, 2, 3);
int main() {
   //whatever
}
1 голос
/ 27 декабря 2008

Экстерн применяется ко всем файлам CPP (и получающихся в результате OBJ), поэтому ни один из них никогда не создает экземпляр БД.

Вот один из способов обойти это. В Database.h измените extern Database db на:

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

, а затем в одном из ваших файлов CPP (неплохо было бы использовать Database.cpp, если он у вас есть), добавьте #define INSTANTIATE_DB перед #include "Database.h".

...