11

C言語では、ファイルのスコープ外のグローバル静的変数にアクセスしたいと思います。それを行うための最良の方法を教えてください。方法の1つは、外部グローバル変数に静的変数の値を割り当てることです。

ファイルAC

static int val = 10;
globalvar = val;

ファイルbc内

extern globalvar;

ただし、この場合、val(file ac)の変更は、(file bc)のglobalvarでは更新されません。

どうすれば同じことができるか教えてください。

ありがとう、Sikandar。

4

4 に答える 4

25

ファイルを変更できる場合は、非静的a.cにするだけです。val

変更はa.cできるが非静的にすることはできない場合val(なぜ?)、それへのグローバル ポインターを宣言するだけで済みます。a.c

int *pval = &val;

そしてb.c行う

extern int *pval;

valこれにより、 throughの現在の値にアクセスできます*pval。または、 の現在の値を返す非静的関数を導入できますval

ただし、他の翻訳単位からアクセスする必要がある場合は、非静的にします。

于 2009-12-29T06:13:21.570 に答える
10

グローバル変数をグローバル静的変数へのポインタにすることができます。

/* file  a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/


/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/

int main()
{
        printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
        return 0;
}

実行時:

$ gcc *.c && ./a.out
100
于 2009-12-29T06:18:13.403 に答える
6

ファイルの外部でファイルレベルの静的変数にアクセスすることはできません。

本当にそれを行う必要がある場合は、いくつかの選択肢があります。

  1. 静的変数を持つファイルにアクセサ関数を追加します。良い点は、これにより、ファイルの外部からのアクセスが読み取り専用アクセスに制限されることです。

    int read_static(){return val; }

  2. 静的修飾子を削除し、変数をグローバルにします。

于 2009-12-29T06:12:29.637 に答える
2

解決策 1:

ファイル内 ac

static int val=10;
int *globalvar =&val;

ファイル bc 内

extern int *globalvar;

解決策 2:

静的変数のアドレスを渡すために別の変数を使用してメモリバイトの浪費を追加する代わりに、静的変数自体をexternとして作成します。

解決策 2 が推奨されますが、静的変数を extern に変更することに制限されている場合は、解決策 1 を使用してください。

于 2009-12-29T07:38:54.830 に答える