1

私はこのコードを持っています:

#include <stdio.h>

extern int x;
void a() {
    int x = 100;
    printf("%d ",x );
    x += 5;
}

void b() {
    static int x = -10;
    printf("%d ", x);
    x += 5;
}

void c(){
    printf("%d ", x);
    x += 2;
}

int main() {
    int x = 10;
    a();
    b();
    c();
    a();
    b();
    c();
    printf("%d ", x);
    getchar();
    return 0;
}

int x = 0;

ここでexternが宣言されているという事実は、コンパイルエラーが発生することを確信していましたが、すべて合格しました。また、Cファイル自体の中にあるexternの意味は何ですか?別のファイルに入れるべきではありませんか?これがコンパイルされないようにするためにこの変数を宣言する方法はありますか?

4

3 に答える 3

2

キーワードはextern変数を宣言し、別の場所にその定義があることをコンパイラに伝えます。投稿されたコードの場合、 の定義は のx後に発生しmain()ます。int x = 0;afterを削除するとmain()、コードはビルドされません (コンパイルはされますが、未定義のシンボルが原因でリンクに失敗しますx)。

extern一般に、ヘッダー ファイルで変数 (または関数) を宣言し、別のソース ( .c) ファイルに定義して、同じ変数を複数の翻訳単位で使用できるようにする (そして複数の定義エラーを回避する) ために使用されます。

/* my.h */
#ifndef MY_HEADER
#define MY_HEADER
extern int x;
#endif

/* my.c */
#include "my.h"
int x = 0;

x関数内a()の宣言に注意し、グローバル変数b()を非表示にします。main()x

于 2012-08-01T10:14:43.777 に答える
1

ファイルスコープで識別子の宣言があるため、ファイルスコープで識別子の他の宣言が存在しない場合、識別子には外部リンケージがありました。ただし、貼り付けたコードの最後の行で、ファイル スコープで識別子を定義しました。

そう、extern int x;

int x = 0;は、ファイルの下部にあるグローバルに定義された :を参照します。:)

このコードを実行すると、externed x 変数が main() の後のint x=0を参照するため、 xの値が 2 になり、続いて 4 になるはずです。

于 2012-08-01T11:02:36.857 に答える
0

Extern は、コンパイル単位で変数を宣言するために使用されます。この変数は、他のコンパイル単位で定義されています。

定義と宣言の違いは何ですか?

関数の場合はオプションです。

読む: http://en.wikipedia.org/wiki/External_variable

あなたのコードでは、3 つの関数のそれぞれが別の 'i' を使用しています。c() のみがグローバル x を使用します。

于 2012-08-01T10:09:24.967 に答える