これは非常に些細なことのように思えますが、次の動作に対するやや厳密な説明は、多くのことを理解するのに役立ちextern
ます.
次のサンプル プログラムでは、関数 ( ) 内でextern
変数を宣言しました。すぐ後にファイル スコープで変数を定義して代入すると、プログラムは正常に動作し、出力されます。しかし、内部で変数を定義すると、の後に、宣言がそれにリンクすることを期待すると、失敗して次のエラーが発生します。x
main()
main()
8
8
x
main()
printf()
extern
test.c||In function 'main':|
test.c|7|error: declaration of 'x' with no linkage follows extern declaration|
test.c|5|note: previous declaration of 'x' was here|
||=== Build finished: 1 errors, 0 warnings ===|
#include<stdio.h>
int main()
{
extern int x;
printf("%d",x);
int x=8; //This causes error
}
//int x=8; //This definition works fine when activated
コードに 1 つだけ誤りがあります。このステートメントは、ストレージ クラスを持つ変数として再度int x=8
宣言していることを意味します。残りはわかりません。次のことを教えてください。x
auto
1)警告やエラーなしで、関数内extern
で変数を宣言できるのはなぜですか?有効な場合、それは正確にはどういう意味ですか?
2)x
関数内でas として宣言extern
し、エラーが表示されなかったので、変数が外部で定義されている場合、この宣言が関数内の変数の定義にリンクされず、外部に見えるのはなぜですか? ストレージクラス宣言auto-vs-extern
の競合が原因ですか?