電子書籍の厳選無料作品が豊富!

C言語で関数のプロトタイプ宣言をした時に、externを付けた場合と付けなかった場合で何か違いとかあるのでしょうか?(別のファイルで定義した関数を、他のファイルから宣言して使う場合を想定しています。)

A 回答 (4件)

extern を付けると強制的に「外部リンケージを指定する」のに対し, extern を付けない場合にはそのような効果はない (翻訳単位全体を見たあとで「ああ, 外部リンケージが必要なんだな」と判断されるケースはある).



なので,
同名で「外部リンケージを持たない」ことを指定する宣言が他に存在する
場合には
・extern が付いていると不正なプログラム
・extern が付いていないと不正でないプログラム
と違いを生じることになる.
    • good
    • 0

extern は、


定義ではなく宣言であると明示するキーワードなので、
関数プロトタイプ宣言は元から宣言であり、付けても意味は変わりません。
変数定義に付けて宣言に変えるのが主な使い方です。

extern "C" は、
宣言に加えて呼び出し規則も明示するため、
C言語とは異なる呼び出し規則の言語から呼び出すときに違いが出ます。
    • good
    • 0

違いは無い。


理由はこれ↓
https://cloudtofu.wordpress.com/2010/05/05/c%E8% …
    • good
    • 0

#include "hoge.h"


全ファイルから参照される場合は、hoge.hで宣言すれば
変わらないかと考えます。
関数・変数の実態はここにはなく外部参照ですと宣言してるだけ
実際は
グローバール関数・変数では、extern 宣言無でも関数は共有されます。

コード上は、どこかで関数本体を定義すればいいだけです。
古典的なCでは、関数を定義前に使った場合戻り値int ,引数voidとして
処理さえ、後で実体が定義されて引数と戻り値が違ってもエラーでません。
多くのバグの元ですが・・

いまのCは、プロトタイプ宣言無でも問題なく変な引数の場合はエラーでます。

C++の場合はエラーになります。
int hoge(void);
init hoge(int);
の関数が存在できるから
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A