C локальные и глобальные статические переменные

Насколько я понимаю, локальная статическая переменная имеет "область действия программы"; то есть после определения он живет до тех пор, пока программа не завершится. Кроме того, я понимаю, что локальная статика также доступна за пределами текущего модуля/C-файла, в котором они определены:

void doSomething() {
    static int myVar = 5;   // Program scope & accessible to other modules
}

Мое понимание заключается в том, что глобальные статические переменные также имеют область действия программы, но они видны только текущему модулю/C-файлу:

static int myVar = 5;       // Program scope but "module private"
void doSomething() {
    // Whatever here...
}

Разве это не немного назад? Я ожидал, что все будет наоборот. Поэтому я спрашиваю: правильно ли мое понимание выше? Если да, то какова мотивация того, чтобы локальная статика была доступна за пределами их текущего модуля, но не глобальная статика?


person smeeb    schedule 15.07.2015    source источник


Ответы (3)


Ты все испортил. Статическая локальная переменная — это место, где можно скрыть данные от других функций, но сохранить данные для будущих вызовов этой функции.

Статические глобальные переменные имеют

  • продолжительность статического хранения (сохранение данных для будущего вызова)
  • внутренняя связь (переменная ограничена одним файлом) и
  • область действия файла (только в текущем файле можно ссылаться на переменную)

Статические локальные переменные имеют

  • продолжительность статического хранения
  • нет связи
  • область блока
person haccks    schedule 15.07.2015

Неа. Локальные статические переменные доступны в данном модуле.

В то время как глобальные статические переменные доступны в данном C-файле.

person NightWatcher    schedule 15.07.2015

Область действия локальной статической переменной ограничена только функцией.
Как видите, следующий код выдает ошибку компиляции, поскольку пытается получить доступ к переменной "prox" из main, даже если она статическая.

int main(void)
{
test();
printf("The PROX is : %d", prox);
}

test()
{
static prox;
prox=prox+5;
printf("INSIDE prox[%d]",prox);
}
person Pawan    schedule 15.07.2015