C で extern キーワードを正しく使用する方法

"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 キーワードを使用せずに単一のソース ファイルで定義する必要があります。ベスト プラクティスとして、単一のソース ファイルは、ヘッダー ファイルの名前を共有する必要があります。