Cでシャドウされたグローバル変数にアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/618769

  •  03-07-2019
  •  | 
  •  

質問

Cでシャドウされたグローバル変数にアクセスするにはどうすればよいですか? C ++では、グローバル名前空間に :: を使用できます。

役に立ちましたか?

解決

ファイルスコープ変数が静的でない場合、ネストされたスコープでexternを使用する宣言を使用できます。

int c;

int main() {
    {
        int c = 0;
        // now, c shadows ::c. just re-declare ::c in a 
        // nested scope:
        {
            extern int c;
            c = 1;
        }
        // outputs 0
        printf("%d\n", c);
    }
    // outputs 1
    printf("%d\n", c);
    return 0;
}

変数がstaticで宣言されている場合、それを参照する方法がわかりません。

他のヒント

cには::はありませんが、getter関数を使用できます

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}

シャドウ化されたグローバル変数について話している場合、(Linuxの場合) dlsym()を使用して、次のようにグローバル変数のアドレスを見つけることができます:

int myvar = 5;    // global

{
    int myvar = 6;    // local var shadows global
    int *pglob_myvar = (int *)dlsym(RTLD_NEXT, "myvar");
    printf("Local: %d, global: %d\n", myvar, *pglob_myvar);
}

コードをセクシーに見せたい場合は、マクロを使用します:

#define GLOBAL_ADDR(a,b)  b =(typeof(b))dlsym(RTLD_NEXT, #a)
...
int *pglob_myvar;
GLOBAL_ADDR(myvar, pglob_myvar);
...

Cでシールドされたグローバル変数 に応じて、異なる回答が可能です。

別のソースファイルまたはリンクライブラリで定義されたグローバル変数を意味する場合は、 extern プレフィックスを付けて再度宣言するだけで済みます。

extern int aGlobalDefinedElsewhere;

もしグローバル変数が同じ名前のローカル変数によって隠されている(または隠されている、お好みの用語を選択している)ことを意味する場合、Cでこれを行う組み込みの方法はありません。それを回避するために。考えられる解決策は次のとおりです。

  • グローバル変数にアクセスするためのゲッター/セッター関数(特にマルチスレッドの状況では、これは良い習慣です)

  • ローカル変数の前に定義されたポインターを使用してグローバルにエイリアスします:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    

「シールドグローバル変数」とは純粋なCですか?

Cにはローカル変数、ファイルローカル/グローバル変数(静的)、グローバル変数(外部)があります

so file1.c:
int bla;

file2.c
extern int bla;

さらに別のオプションは、ローカルを定義する前にグローバルを参照するか、少なくともローカルへの定義後にアクセスできるように少なくとも最初にポインタを取得することです。

#include <stdio.h>

int x = 1234;
int main()
{
   printf("%d\n",x); // prints global
   int x = 456;
   printf("%d\n",x); // prints local
}

gyz y 2考えすぎ ポインタ変数nを使用するだけで、グローバル変数のアドレスを格納します。ndenはd main()内で使用します。ポインタを使用してグローバル変数を参照することは、同じ名前のローカル変数がmain()内にある場合でも問題になりません。

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