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

Приложения Heroku работают в обычной системе unix, и у вас есть все файлы zoneinfo. Я также уверен, что они актуальны.

Что касается unix, вы можете установить Tv env var с чем-то вроде:

$ heroku config:set TZ=Europe/Berlin

Вы можете видеть действительные имена зоныinfo с помощью:

$ heroku run find /usr/share/zoneinfo/posix

Вообще говоря, вы хотите запустить приложение в среде UTC и обрабатывать часовые пояса внутри, возможно, обрабатывать локальное время на пользователь на основе пользователя.

Я подозреваю, что это может не полностью ответить на ваш вопрос. Возможно, вам захочется расширить то, что именно вы пытаетесь достичь, и как вы его пытаетесь достичь, а также то, как вы наблюдаете эффект «на час меньше, чем местный».

27
задан vitaly.v.ch 8 March 2009 в 09:06
поделиться

5 ответов

Если Ваша переменная объема файла не является статической, то можно использовать объявление что экстерн использования во вложенном объеме:

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

, Если переменная объявляется с помехами, я не вижу способ относиться к нему.

43
ответ дан Johannes Schaub - litb 14 October 2019 в 13:00
поделиться

Существует нет:: в c, но можно использовать функцию метода get

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}
21
ответ дан Dutow 14 October 2019 в 13:00
поделиться

Если Вы говорите о затененном глобальном 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);
...
4
ответ дан qrdl 14 October 2019 в 13:00
поделиться

В зависимости от того, что Вы называете экранированная глобальная переменная в C, различные ответы возможны.

, Если Вы имеете в виду глобальную переменную, определенную в другом исходном файле или связанной библиотеке, только необходимо объявить это снова с extern префикс:

extern int aGlobalDefinedElsewhere;

, Если Вы имеете в виду затененную глобальную переменную (или затмеваемый, выберите терминологию, которую Вы предпочитаете) локальной переменной того же имени), нет никакого встроенного способа сделать это в C. Таким образом, Вы не должны или делать этого или работать вокруг этого. Возможные решения:

  • метод get/метод set функционирует для доступа к глобальной переменной (который является хорошей практикой, в особенности в многопоточных ситуациях)

  • псевдонимы к globals посредством указателя, определенного перед локальной переменной:

    int noName;
    {
        int * aliasToNoName = &noName; /* reference to global */
        int noName;                    /* declaration of local */
        *aliasToNoName = noName;       /* assign local to global */
    }
    
2
ответ дан mouviciel 14 October 2019 в 13:00
поделиться

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

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

so file1.c:
int bla;

file2.c
extern int bla;
1
ответ дан Peter Miehle 14 October 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: