4

C での extern キーワードの使用について混乱しています。変数で使用すると、変数の宣言を意味します。main() 関数の外側で変数 tmp を宣言し、main の別のブロックで定義しますが、後続のブロックで値を出力すると、「UNRESOLVED EXTERNAL LINK」というエラーが発生しました。困っています 詳しい説明をお願いします。


#include <stdio.h>
extern int tmp ;
int main()
{
    {
        int tmp = 50;
    }
    {
        printf("%d",tmp);
    }
    return 0;
}

4

5 に答える 5

7

いいえ; extern int tmp;「変数の定義が別の場所にある」ことを意味しますtmp。これは宣言です — 参照できますtmpが、定義されていません。さらに、extern int tmp;関数の外側に記述する場合、変数は関数の外側で定義されることを意味します。これは、現在のソース ファイルまたは別のソース ファイルの別の場所で定義される可能性があるグローバル変数です。(関数内での記述のルールextern int tmp;はやや複雑です。ここでは触れません!)

関数内のローカル変数は、外部で宣言さint tmp = 50;れたグローバル変数とは無関係です。tmpローカル変数は、中括弧内にグローバル変数を隠します。(ローカル変数も使用されません。)printf()ただし、ステートメントはグローバル変数を参照します。ローカル変数は のスコープ内にありませんprintf()

グローバル変数を定義していないため (たとえば、ファイルの末尾に追加することによってint tmp = -2;)、プログラムはリンクに失敗し、このソース ファイルで変数を定義するか、別のソース ファイルでリンクするまでリンクを続行します。変数が定義されています。

于 2013-09-05T07:31:17.040 に答える
1

Extern は redeclaration であるため、変数をクレートしませんが、実際の宣言が別の場所にあることをコンパイラに伝えるだけです。あるソース ファイルで使用して別のファイルの変数宣言を参照したり、同じファイルで以前に宣言されたグローバル変数を使用することを表現したりできます。

したがって、グローバル変数を宣言するとき

int a=5;

同じソース ファイルで in 関数を使用する場合は、extern int a; を追加できます。関数の本体で、グローバル変数を使用していることを明確に伝えますが、宣言はここではありません。

type func(arguments){
extern int a;
.
.
.

int a=5 が別のソースファイルにある場合

 extern int a; 

ソースファイルでは、実際には前のソースファイルで宣言されたグローバル変数 a を使用したいと考えています。

于 2013-09-05T07:29:44.953 に答える
0

リンケージについてです。変数を宣言するときはextern、外部リンクを指定します。これは、グローバル リンケージで別の場所で定義されていることを示します。

関数では、tmp という変数を定義していますが、グローバル リンケージはなく、ローカル変数です。グローバルリンケージを与えるには、関数の外で定義する必要があります。

静的リンケージもあります。これは、変数がグローバルであるが、現在のコンパイル ユニット (ソース ファイル) に対してのみであることを意味します。

于 2013-09-05T07:30:19.290 に答える
0

externキーワードを使用して、シンボルのみを宣言しますtmp。つまり、シンボルは別の場所で定義されており、リンク時に解決されます。
そのため、シンボルを定義するコンパイル済みオブジェクトを提供しない場合、リンカーは何らかの「未解決のシンボル」エラーを返します。

C での宣言または定義の詳細については、次の質問を参照してください。

于 2013-09-05T07:30:35.483 に答える