"extern
" リンケージを変更します。キーワードを使用すると、関数/変数は別の場所で使用可能であると見なされ、解決はリンカーに委ねられます。
関数と変数の「extern」には違いがあります。変数では、変数自体をインスタンス化しません。つまり、メモリを割り当てません。これは別の場所で行う必要があります。したがって、変数を別の場所からインポートする場合は重要です。関数の場合、これはリンケージが extern であることをコンパイラに伝えるだけです。これがデフォルトであるため (extern リンケージを使用して関数がバインドされていないことを示すためにキーワード「static」を使用します)、明示的に使用する必要はありません。
外部 このデータがどこかで定義され、リンカに接続されることをコンパイラに伝えます。
ここでの回答の助けを借りて、ここで数人の友人と話すことは、extern の使用の実際的な例です .
例 1 - 落とし穴を示す:
File stdio.h:
int errno;
/* other stuff...*/
myCFile1.c:
#include <stdio.h>
Code...
myCFile2.c:
#include <stdio.h>
Code...
myCFile1.o と myCFile2.o がリンクされている場合、各 c ファイルには errno の個別のコピーがあります。 .これは同じ errno と同じ問題です リンクされたすべてのファイルで利用できるはずです。
例 2 - 修正。
File stdio.h:
extern int errno;
/* other stuff...*/
File stdio.c
int errno;
myCFile1.c:
#include <stdio.h>
Code...
myCFile2.c:
#include <stdio.h>
Code...
myCFile1.o と MyCFile2.o の両方がリンカーによってリンクされている場合、両方とも同じ errno を指します。 .したがって、extern で実装を解決します .
extern
キーワードは関数に対して冗長です。
コンパイル単位間で共有される変数については、extern キーワードを使用してヘッダー ファイルで宣言し、extern キーワードを使用せずに単一のソース ファイルで定義する必要があります。ベスト プラクティスとして、単一のソース ファイルは、ヘッダー ファイルの名前を共有する必要があります。