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