C에서 섀도우로 된 글로벌 변수에 어떻게 액세스 할 수 있습니까?

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

  •  03-07-2019
  •  | 
  •  

문제

C에서 섀도우로 된 글로벌 변수에 어떻게 액세스 할 수 있습니까? C ++에서는 사용할 수 있습니다 :: 글로벌 네임 스페이스 용.

도움이 되었습니까?

해결책

파일 스코프 변수가 정적이 아닌 경우 중첩 된 범위에서 외부를 사용하는 선언을 사용할 수 있습니다.

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;
}

변수가 정적으로 선언되면 참조하는 방법이 없습니다.

다른 팁

C가 있지만 C는 getter 기능을 사용할 수 있습니다.

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

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

Shadowed Global var에 대해 이야기하고 있다면 (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에서는이 작업을 수행 할 수있는 방법이 없습니다. 그것. 가능한 솔루션은 다음과 같습니다.

  • 글로벌 변수에 액세스하기위한 getter/setter 기능 (특히 멀티 스레드 상황에서는 모범 사례입니다)

  • 로컬 변수 앞에 정의 된 포인터를 통해 글로벌에 대한 별칭 :

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

순수한 C에서 "차폐 된 글로벌 변수"란 무엇입니까?

C에는 로컬 변수, 파일 로컬/글로벌 변수 (정적) 및 글로벌 변수 (extern)가 있습니다.

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 저장 저장소의 주소를 저장하십시오. 포인터를 사용하여 글로벌 변수를 참조하면 동일한 이름의 로컬 변수가 Main () 내에 있더라도 문제가되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top