質問

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

ファイルACで

static int val = 10;
globalvar = val;

ファイルBCで

extern globalvar;

ただし、この場合、VAL(ファイルAC)の変更は(ファイルBC)のGlobalVarで更新されません。

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

ありがとう、シカンダル。

役に立ちましたか?

解決

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

変更できる場合 a.c しかし、作ることはできません val 非静的(なぜ?)、それからあなたはそれに対するグローバルなポインターを宣言することができます a.c

int *pval = &val;

とで b.c 行う

extern int *pval;

現在の値にアクセスできます val 終えた *pval. 。または、現在の値を返す非静的関数を導入することもできます val.

しかし、繰り返しますが、他の翻訳ユニットからアクセスする必要がある場合は、非静的にするだけです。

他のヒント

グローバルな静的変数へのグローバル変数ポインターを作成できます。

/* 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

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

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

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

    int read_static(){return val; }

  2. 静的予選をドロップし、変数をグローバルにします。

解決策1:

ファイルACで

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

ファイルBCで

extern int *globalvar;

解決策2:

静的変数のアドレスを渡すために別の変数を持つ代わりに、それによりメモリバイトの無駄がほとんど追加されていないため、静的変数自体を外部として作成します。

ソリューション2をお勧めしますが、静的変数を外部に変更することに制限されている場合は、ソリューション1を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top