Как я могу получить доступ к затененной глобальной переменной в C? - PullRequest
26 голосов
/ 06 марта 2009

Как я могу получить доступ к затененной глобальной переменной в C? В C ++ я могу использовать :: для глобального пространства имен.

Ответы [ 7 ]

41 голосов
/ 08 марта 2009

Если ваша переменная области файла не является статической, вы можете использовать объявление, которое использует 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, я не вижу способа сослаться на нее.

21 голосов
/ 06 марта 2009

Нет :: в c, но вы можете использовать функцию получения

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}
4 голосов
/ 06 марта 2009

Если вы говорите о теневом глобальном 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);
...
2 голосов
/ 06 марта 2009

В зависимости от того, что вы называете экранированной глобальной переменной в 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 */
    }
    
1 голос
/ 06 марта 2009

Что такое «экранированная глобальная переменная» в чистом C?

в C у вас есть локальные переменные, файловые локальные / глобальные переменные (статические) и глобальные переменные (extern)

so file1.c:
int bla;

file2.c
extern int bla;
0 голосов
/ 15 августа 2015

Еще один вариант - ссылаться на глобальный перед определением вашего локального или, по крайней мере, сначала получить указатель на него, чтобы вы могли получить к нему доступ после определения своего локального.

#include <stdio.h>

int x = 1234;
int main()
{
   printf("%d\n",x); // prints global
   int x = 456;
   printf("%d\n",x); // prints local
}
0 голосов
/ 23 ноября 2011

gyz y 2 так много думаю Просто используйте переменную-указатель n для хранения адреса глобальной переменной в ней и не используйте ее внутри d main (). использование указателя для ссылки на глобальную переменную не будет проблемой, даже если внутри main () есть локальная переменная с таким же именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...