![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.1ベストアンサー
- 回答日時:
>とあっても、前の 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 を参照/更新することができます。
この回答へのお礼
お礼日時:2017/10/10 09:41
回答ありがとうございます。
直接こう書いてあるわけではなくて、includeファイルをたどっていくと結果的にこうなっているのですがエラーではないのですね。
こうならないように includeファイルの作り方に工夫が必要なのかと思っていました。
No.4
- 回答日時:
極端にいうと, extern というのは (初期値がなければ)
どこかで定義されている
という意味だと思っていいです. 「どこかで」というのは文字通りの意味で, 同じファイルの別のところかもしれないし別のファイルかもしれないです.
おかしな例だけど
static int a;
extern int a;
と書いてあってもプログラムとしては正しかったりします. 本当にこう書いてあったら頭を疑いますが.
No.3
- 回答日時:
extern int a;
の方は a の宣言 (この場合は外部リンケージを持つ int 型の変数を宣言している),
int a;
は a の定義 (規格上は「仮定義」)
なので問題ないです. 関数の場合に
void foo(); /* ここで宣言しておく */
int main()
{
/* なんかする */
foo();
/* ここでもなんかする */
}
void foo() /* ここで定義する */
{
/* たぶん処理をしてるんだと思う */
}
と書いても問題ないのと同じ.
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
No.2
- 回答日時:
No1です。
extern a; //souce1.cで定義したint aを参照
は
extern int a; //souce1.cで定義したint aを参照
の誤りです。(3か所)
上記のように読み替えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- MySQL MYSQL エラー 2 2022/10/18 11:37
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
C++でboolにintの値を代入する...
-
分割コンパイル時に構造体....
-
C言語での方向キー入力判定
-
main.c:7:43: warning: implici...
-
関数の実体定義にヘッダファイ...
-
visualstudio C# テキストボッ...
-
構造体の宣言でエラーが出ます。
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++の(左辺値)参照を参照渡し
-
コンパイルエラー
-
構造体の要素すべてに対する四...
-
2重定義って??
-
C言語でのフィボナッチ数列の表示
-
DLLでLIBファイルが作成されない
-
変数の型を定義しなかった場合...
-
staticで初期化した変数(?)を使...
-
C++の規格
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報