C에서 섀도우로 된 글로벌 변수에 어떻게 액세스 할 수 있습니까?
-
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 () 내에 있더라도 문제가되지 않습니다.