ヘッダーファイルで関数をextern
にする必要がありますか?または、デフォルトでextern
ですか?
たとえば、これを書く必要があります:
// birthdays.h
struct person find_birthday(const char* name);
またはこれ:
// birthdays.h
extern struct person find_birthday(const char* name);
から C Book :
宣言にexternストレージクラス指定子が含まれている場合、またはストレージクラス指定子のない関数の宣言(またはその両方)の場合、次のようになります。
- ファイルスコープを持つ識別子の可視宣言が既に存在する場合、結果のリンケージは可視宣言のリンケージと同じです。
- それ以外の場合、結果は外部リンケージです。
したがって、これが翻訳単位で宣言されている唯一の場合、外部リンケージがあります。
それらは「extern」で暗黙的に宣言されます。
ヘッダーで宣言された関数は通常(あなたが本当に一生懸命働いていない限り)extern
です。個人的には、明示的なキーワードをそこに表示することを好みますが、コンパイラはそれを必要としません。それは読者にextern
であることを思い出させ、人間はコンピューターよりも誤りやすいので、リマインダーが助けになると思います。
変数では、ヘッダーファイルでextern
キーワードを使用することが重要です(初期化子はありません)。そのため、ヘッダーで宣言された(ごく少数の)グローバル変数との対称性のために、厳密には必要ではありませんが、関数でもextern
を使用します。
いいえ、ヘッダーファイルで宣言された関数は、extern
として宣言する必要はありません。
ただし、.h
ヘッダーで定義された変数、次に複数の#included
ファイルで.c
externを宣言する必要があります 。
私はソースコードの「外部」を気にしませんが、一部の人はそうします。私の考えでは、関数の前にexternを変数の前に置くと、どのものが関数であり、どのものが変数であるか(関数ポインターを含む可能性がある)が視覚的に明確になります。おそらく、.hファイルの宣言がどのように作成され、それらがメインの.cファイルにどのように関係するかに依存していると思います。通常、.hファイルのプロトタイプを入力してから、.cファイルにコピーして貼り付け、関数本体を追加します(プロトタイプの最後にセミコロンを入力します)。そのため、「extern」を追加する必要があります。ヘッダーファイル、またはコピー/貼り付け後にメインの.cファイルから削除。