Как я могу получить доступ к затененной глобальной переменной в C?
-
03-07-2019 - |
Вопрос
Как я могу получить доступ к затененной глобальной переменной в 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, но вы можете использовать функцию получения
#include <stdio.h>
int L=3;
inline int getL()
{
return L;
}
int main();
{
int L = 5;
printf("%d, %d", L, getL());
}
Если вы говорите о теневом глобальном 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 нет встроенного способа сделать это.Так что вам придется либо не делать этого, либо работать над этим.Возможные решения:
функции получения/установки для доступа к глобальной переменной (что является хорошей практикой, особенно в многопоточных ситуациях)
псевдонимы глобальных переменных с помощью указателя, определенного перед локальной переменной:
int noName; { int * aliasToNoName = &noName; /* reference to global */ int noName; /* declaration of local */ *aliasToNoName = noName; /* assign local to global */ }
что такое "экранированная глобальная переменная" в чистом виде?
в 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
}
гыз у 2 так много думаю Просто используйте переменную-указатель n для хранения адреса глобальной переменной в ней и не используйте ее внутри d main (). использование указателя для ссылки на глобальную переменную не будет проблемой, даже если внутри main () есть локальная переменная с таким же именем.