Что не так с использованием extern в C, как это? - PullRequest
1 голос
/ 06 февраля 2012

Я уже что-то искал об этом, но до сих пор не понимаю ...

file1.h

extern int *game_array[5];

Player.c

 #include "file1.h"

   void *delete_player(player_struct *player)
   {
     ... //some code

     game_array[5] = 5;  //undefined reference to `game_array`

     ... //some code
   }

Когда я не использую extern, он "работает нормально" = я могу создать его без ошибок, но программа не закончена .. Я полагаю, использование extern нормально, но что-то не так .. Я хочу использовать этот массив game_array ... игр на сервере из всех моих исходных файлов .c, в моем приложении только один экземпляр этого массива.

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

Вам необходимо определить game_array в одном из ваших .c файлов и скомпилировать / связать этот файл в вашем исполняемом файле.

Определение будет выглядеть так:

int *game_array[5];

То, что говорит ваш file1.h, в основном "Где-то в моем проекте существует переменная с именем game_array, и она имеет такой-то тип" . Однако переменная на самом деле не существует, пока вы не определили ее где-то (обычно в файле .c).

1 голос
/ 06 февраля 2012

Запись extern int *game_array[5]; означает, что где-то в каком-то файле есть фактическое определение для game-array - т. Е. Объявление без extern.. Вы не можете этого предоставить, поэтому компоновщик жалуется, что фактическая переменнаянигде не существует.

1 голос
/ 06 февраля 2012

Ключевое слово extern в основном означает, что компилятор не должен жаловаться на символ, даже если он не определен, потому что он будет доступен во время ссылки.

Так что, если он не определен во время компоновки, вы, очевидно, будете иметь ошибки.

Вам необходимо предоставить реализацию в одном из ваших файлов C:

Что-то вроде:

#include "file1.h"

int * game_array[ 5 ];

void * delete_player( player_struct * player)
{
    ...
...