VS2010 с ключевым словом extern - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть следующие два файла:

  1. foo.h
  2. bar.cpp

В foo.h Я объявляю переменную extern.

Теперь я хотел бы использовать ту же переменную в bar.cpp (после включения foo.h).

Под VS2008 и VS2010 я получаю unresolved external symbol ошибки, в то время как под Ubuntuс gcc компиляция прошла успешно.

(А именно, я пытаюсь скомпилировать следующий исходный код : http://www.fromdual.com/using-mysql-user-defined-functions-udf; foo.h ссылается на srv0srv.h, а bar.cpp ссылается на исходный кодВсе включения на месте, компиляция прошла успешно, ссылки выпадают)

В чем может быть проблема?

Ответы [ 4 ]

3 голосов
/ 19 апреля 2011

Ключевое слово extern указывает компилятору, что следующая за ним переменная уже объявлена ​​где-то еще.На самом деле он не выделяет место для переменной.Если вы хотите создать глобальную переменную, которую вы можете использовать, включив заголовочный файл (что, кстати, обычно является плохой идеей), вы можете сделать это следующим образом.

В файле foo.h:

extern int myVar;

в foo.cpp:

int myVar;

myVar теперь находится в foo.cpp, но оператор extern в foo.h разрешает код в других файлах (таких как bar.cpp) получить к нему доступ, включив foo.h.

0 голосов
/ 13 апреля 2012

Проблема заключалась в том, что указанный символ должен быть экспортирован (через dllspec) из dll, чтобы быть видимым снаружи. Только ключевое слово extern не позволило увидеть его снаружи.

0 голосов
/ 20 апреля 2011

Ваша переменная должна иметь ссылку где-то в одном из исходных файлов. По ключевому слову extern вы только сообщаете, что «существует переменная», но компоновщик должен знать ее местоположение. Пока вы компилируете исходный код, он будет создавать ссылки для переменных и т. Д. Линкер будет ссылаться в соответствии с этими ссылками. Если вы на самом деле не создадите ссылку на переменную, компоновщик не сможет найти ссылку, поэтому он выдаст ошибку. Если вы используете extern, вы говорите, что не создавайте ссылку на эту переменную или любую другую вещь здесь. Но должна быть ссылка на это где-то еще.

0 голосов
/ 19 апреля 2011

Когда вы используете extern для объявления переменной (глобальной переменной в других исходных объектах или файлах), вы фактически указываете компилятору искать определение переменной где-то еще.В этом случае вам нужно предоставить другой исходный файл, который определяет int myVar.

...