5

次のコードで、特に header.c で問題が発生しました。ここでは、header.h の extern int x 変数にアクセスできません。なぜですか? .h の extern 変数はグローバルではありませんか? これを他のファイルで使用するにはどうすればよいですか?

===header.h===

#ifndef HDR_H
#define HDR_H

extern int x;
void function();

#endif

===header.c===

#include <stdio.h>
#include "header.h"

void function()
{
    printf("%d", x); //****undefined reference to x, why?****
}

===sample.c===

int main()
{
    int x = 1;
    function();
    printf("\n%d", x);
    return 0;
}
4

5 に答える 5

8

宣言

extern int x;

は、一部のソース ファイルに という名前のグローバル変数があることをコンパイラに伝えますx。ただし、関数ではローカル変数mainを宣言します。その宣言を の外側に移動して、グローバルにします。xmain

于 2012-08-08T09:09:26.570 に答える
3

キーワードは、変数が存在すると言いますが、それexternを作成しません。コンパイラは、別のモジュールがその名前のグローバル変数を持つことを期待しており、リンカーはそれらを結合するために正しいことを行います。

sample.c次のように変更する必要があります。

/* x is a global exported from sample.c */
int x = 1;

int main()
{
    function();
    printf("\n%d", x);
    return 0;
}
于 2012-08-08T09:08:04.607 に答える
1

extern変数を宣言しますが、定義しません。基本的に、他の場所の定義があることをコンパイラに伝えxます。修正するには、以下をheader.c(または他の.cファイルであるが1 つのファイルのみ) に追加します。.c

int x;

main()ローカル変数でxは、グローバル変数が非表示になることに注意してくださいx

于 2012-08-08T09:06:14.070 に答える
1

確かに、extern int x;手段xは別の場所/翻訳単位で定義されます。

コンパイラは、xどこか別のグローバル スコープで の定義を見つけることを期待しています。

于 2012-08-08T09:06:54.473 に答える
0

私はあなたのコードをこのように再編成/変更し、header.cを取り除きます

=== sample.h ===

#ifndef SAMPLE_H
#define SAMPLE_H

extern int x;
void function();

#endif

=== sample.c ===

#include <stdio.h>
#include "sample.h"

int x;

void function()
{
    printf("%d", x);
}

int main()
{
    x = 1;
    function();
    printf("\n%d", x);
    return 0;
}
于 2012-08-08T09:32:37.067 に答える