2012-02-06 78 views
1

我已經搜查的東西阿布這一點,但我還是不明白它..在C中使用extern有什麼問題?

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 
    } 

當我不t使用extern它「工作很好」=我可以建立它與你的錯誤,但程序沒有完成.. 我想使用extern很好,但有些地方是錯誤的。 我想用這個game_array ...陣列的遊戲在服務器上我的.c源文件,在我的應用程序中只有一個這個數組的實例。

回答

3

您需要在您的.c文件之一中定義game_array,然後將該文件編譯/鏈接到您的可執行文件中。

的定義如下所示:

int *game_array[5]; 

你的file1.h是說基本上是「存在一個在我的項目叫game_array某處變量,它有這樣的,和這種類型的」。但是,變量實際上並不存在,除非您已將其定義在某處(通常位於.c文件中)。

+0

但是應該在哪裏定義?當我有更多的.c文件?只在其中一個? – user1097772 2012-02-06 18:15:14

+0

@ user1097772:對於編譯器和鏈接器,只要該文件包含在構建中,則無論您在哪個文件中定義變量。通常,如果你在一個名爲'file1.h'的文件中有這樣的聲明,那麼你可以在名爲'file1.c'(同名,不同的擴展名)的文件中定義變量。 – NPE 2012-02-06 18:17:01

+0

ok,所以file1.h => extern,file1.c定義(沒有extern),當我想在file2.c中使用它時,我只會將file1.h包含到file2.c中?我對嗎? – user1097772 2012-02-06 18:20:09

1

extern關鍵字基本上意味着編譯器不應該抱怨該符號,即使它沒有被定義,因爲它將在鏈接時可用。

所以,如果它沒有在鏈接時定義,你很明顯會有錯誤。

你需要在你的C文件的一個提供一個實現:

喜歡的東西:

#include "file1.h" 

int * game_array[ 5 ]; 

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

extern int *game_array[5];意味着某個地方,在一些文件中,有一個爲game-array一個實際的定義 - 即,一個沒有extern.的聲明你沒有提供這個,所以鏈接器會抱怨實際的變量在任何地方都不存在。