4

これは非常に些細なことのように思えますが、次の動作に対するやや厳密な説明は、多くのことを理解するのに役立ちexternます.

次のサンプル プログラムでは、関数 ( ) 内でextern変数を宣言しました。すぐ後にファイル スコープで変数を定義して代入すると、プログラムは正常に動作し、出力されます。しかし、内部で変数を定義すると、の後に、宣言がそれにリンクすることを期待すると、失敗して次のエラーが発生します。xmain()main()88xmain()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宣言していることを意味します。残りはわかりません。次のことを教えてください。xauto

1)警告やエラーなしで、関数externで変数を宣言できるのはなぜですか?有効な場合、それは正確にはどういう意味ですか?

2)x関数内でas として宣言externし、エラーが表示されなかったので、変数が外部で定義されている場合、この宣言が関数内の変数の定義にリンクされず、外部に見えるのはなぜですか? ストレージクラス宣言auto-vs-externの競合が原因ですか?

4

4 に答える 4

6

extern変数宣言は、グローバル変数の定義が別の場所にあるというコンパイラーへの約束です。ローカル変数は、リンカーからは見えないため、コンパイラに対する約束の履行とは見なされません。ある意味で、extern宣言は関数の前方宣言に似ています。コンパイラに「この関数があることはわかっているので、今すぐ使用させて、リンカーに実際の実装を見つけるように任せてください」と言います。

于 2013-05-09T10:23:11.417 に答える
1

関数内で変数を extern として宣言すると、その関数の外でしか定義できないという概念を覚えておいてください。

于 2013-07-30T09:41:50.267 に答える
0
Why are we allowed to declare an extern variable inside a function,without any warning or error?If valid,what exactly does it mean?

回答:- extern を機能レベルで使用して、その機能のスコープ中にのみ公開することができます。

Since we declared x as extern inside the function and it showed no error,why then this declaration doesn't link to the definition of the variable inside the function,but looks outside,when the variable is defined outside? Is conflicting storage-class declaration auto-vs-extern the reason for this?

Ans:ブロックスコープで宣言された変数 (つまり、ローカル変数) は、明示的に extern として宣言されない限り、リンケージを持ちません。

于 2013-05-09T10:41:21.067 に答える
-1

このように extern を使用する人はいません。extern は通常、大きなプロジェクトで使用され、大量の .c 、 .h ファイル、およびいくつかの変数を共有する必要があります。そのような状況では、コンパイルは変数宣言の解決に失敗することがよくあります (おそらく、まだコンパイルされていない .h ファイルにあります)。次に、「extern」を使用して、コンパイラーに今のところそれを残してコンパイルを続行するように指示します。リンクフェーズ。

于 2013-05-09T10:26:14.420 に答える