2012-02-06 12 views
1

私はドンときPlayer.cCのようにexternを使用すると何が問題になりますか?

は」
#include "file1.h" 

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

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

    ... //some code 
    } 

file1.h

extern int *game_array[5]; 

..私はすでにこのアボ何かを検索したが、私はまだそれを理解していないしました私はそれを構築することはできませんが、プログラムは終了していません。 私はexternを使用しているとは思えますが、何かが間違っています.. 私はこのgame_arrayを使用したい...ゲームの配列サーバーから私の.cソースファイルは、私のアプリケーションにはこの配列のインスタンスが1つしかありません。

答えて

3

のいずれかのファイルにgame_arrayを定義し、そのファイルを実行可能ファイルにコンパイル/リンクする必要があります。

定義は次のようになります。あなたのfile1.hは基本的に「が私のプロジェクトでgame_arrayどこかという変数が存在する、そしてそれは、このような、そのような-と型がある」をされたと言っている

int *game_array[5]; 

何。ただし、変数は実際にはどこかに定義するまで存在しません(通常、.cファイル内にあります)。

+0

しかし、どこを定義する必要がありますか?より多くの.cファイルがある場合そのうちの1人だけ? – user1097772

+0

@ user1097772:コンパイラとリンカにとって、ファイルがビルドに含まれている限り、変数を定義するファイルには関係ありません。従来、 'file1.h'というファイルに次のような宣言がある場合、変数を' file1.c'というファイル(同じ名前、別の拡張子)で定義します。 – NPE

+0

okだから、file1.h => extern、file1.cの定義(externなし)、file2.cで使用したいときは、file2.hにfile1.hをインクルードしますか?私は正しい? – user1097772

1

externキーワードは基本的に、シンボルが定義されていなくても、リンク時に使用できるため、コンパイラがシンボルについて不平を言ってはならないことを意味します。

リンク時に定義されていない場合は、明らかにエラーが発生します。

あなたのCファイルのいずれかに実装を提供する必要がありますよう

何か:extern int *game_array[5];を書く

#include "file1.h" 

int * game_array[ 5 ]; 

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

はどこかに、いくつかのファイルで、game-arrayための実際の定義があることを意味します - すなわち、なしの宣言extern.あなたはそれを提供していないので、実際の変数がどこにも存在しないことをリンカが訴える。

関連する問題