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

C ソースコード中に、

extern int a;
int a;

とあっても、前の extern int a; は無視されるだけで、エラーにはならないのですか。

A 回答 (4件)

>とあっても、前の extern int a; は無視されるだけで、エラーにはならないのですか。



無視されるわけではありませんが、結局はエラーにはなりません。

extern int a;は
int型のaが、どこかに定義されていることを要求します。
その直後に、int a;と定義されているのでOKとなります。

但し、通常は、このような方法は行いません。
extern int a;のような定義を行うのは、複数のソースファイルで1つの変数を共有する場合です。
例えば、以下のようなケースです。

source1.c
int a; //定義


sourc2.c
extern a; //souce1.cで定義したint aを参照


sourc3.c
extern a; //souce1.cで定義したint aを参照

sourc4.c
extern a; //souce1.cで定義したint aを参照


上記のようにすると、全てのソースで1つの変数 int a を参照/更新することができます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

直接こう書いてあるわけではなくて、includeファイルをたどっていくと結果的にこうなっているのですがエラーではないのですね。
こうならないように includeファイルの作り方に工夫が必要なのかと思っていました。

お礼日時:2017/10/10 09:41

極端にいうと, extern というのは (初期値がなければ)


どこかで定義されている
という意味だと思っていいです. 「どこかで」というのは文字通りの意味で, 同じファイルの別のところかもしれないし別のファイルかもしれないです.

おかしな例だけど
static int a;
extern int a;
と書いてあってもプログラムとしては正しかったりします. 本当にこう書いてあったら頭を疑いますが.
    • good
    • 0
この回答へのお礼

なるほど。
ありがとうございました。

お礼日時:2017/10/11 06:59

extern int a;


の方は a の宣言 (この場合は外部リンケージを持つ int 型の変数を宣言している),
int a;
は a の定義 (規格上は「仮定義」)
なので問題ないです. 関数の場合に
void foo(); /* ここで宣言しておく */
int main()
{
/* なんかする */
foo();
/* ここでもなんかする */
}
void foo() /* ここで定義する */
{
/* たぶん処理をしてるんだと思う */
}
と書いても問題ないのと同じ.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
extern とあるからと言ってこのファイルの外で定義されているとは限らないということですね。

お礼日時:2017/10/10 18:08

No1です。


extern a; //souce1.cで定義したint aを参照

extern int a; //souce1.cで定義したint aを参照
の誤りです。(3か所)
上記のように読み替えてください。
    • good
    • 0

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