web-dev-qa-db-ja.com

ヘッダーファイルで関数を「外部」にする必要がありますか?

ヘッダーファイルで関数をexternにする必要がありますか?または、デフォルトでexternですか?

たとえば、これを書く必要があります:

// birthdays.h
struct person find_birthday(const char* name);

またはこれ:

// birthdays.h
extern struct person find_birthday(const char* name);
39
bodacydo

から C Book

宣言にexternストレージクラス指定子が含まれている場合、またはストレージクラス指定子のない関数の宣言(またはその両方)の場合、次のようになります。

  • ファイルスコープを持つ識別子の可視宣言が既に存在する場合、結果のリンケージは可視宣言のリンケージと同じです。
  • それ以外の場合、結果は外部リンケージです。

したがって、これが翻訳単位で宣言されている唯一の場合、外部リンケージがあります。

19

それらは「extern」で暗黙的に宣言されます。

15
tur1ng

ヘッダーで宣言された関数は通常(あなたが本当に一生懸命働いていない限り)externです。個人的には、明示的なキーワードをそこに表示することを好みますが、コンパイラはそれを必要としません。それは読者にexternであることを思い出させ、人間はコンピューターよりも誤りやすいので、リマインダーが助けになると思います。

変数では、ヘッダーファイルでexternキーワードを使用することが重要です(初期化子はありません)。そのため、ヘッダーで宣言された(ごく少数の)グローバル変数との対称性のために、厳密には必要ではありませんが、関数でもexternを使用します。

13

いいえ、ヘッダーファイルで宣言された関数は、externとして宣言する必要はありません。

ただし、.hヘッダーで定義された変数、次に複数の#includedファイルで.cexternを宣言する必要があります

10
StuartLC

私はソースコードの「外部」を気にしませんが、一部の人はそうします。私の考えでは、関数の前にexternを変数の前に置くと、どのものが関数であり、どのものが変数であるか(関数ポインターを含む可能性がある)が視覚的に明確になります。おそらく、.hファイルの宣言がどのように作成され、それらがメインの.cファイルにどのように関係するかに依存していると思います。通常、.hファイルのプロトタイプを入力してから、.cファイルにコピーして貼り付け、関数本体を追加します(プロトタイプの最後にセミコロンを入力します)。そのため、「extern」を追加する必要があります。ヘッダーファイル、またはコピー/貼り付け後にメインの.cファイルから削除。

2
supercat