Глобальные переменные stati c, используемые в нескольких исходных файлах - PullRequest
0 голосов
/ 03 мая 2020

Изучая переменные extern и static в C / C ++, я наткнулся на этот ответ .

Возможно, я упускаю какой-то момент, но этот ответ вызвал сомнения относительно моего кода.

Предположим, у меня есть следующие файлы:

  • header.h
static int global_foo = -1;

void doSomething(void);
  • source1. c
#include "header.h"

void doSomething(void) {
  global_foo = 1;
}
  • main. c
#include "header.h"

int main(void) {
  doSomething();
  printf("%d\n", global_foo);
}

Что такое вывод printf в основной функции? Моя интерпретация заключается в том, что, поскольку global_foo включено два раза, будет два различных global_foo, и поэтому одно такое изменение повлияет только на global_foo файла, которому оно принадлежит.

Ответы [ 2 ]

4 голосов
/ 03 мая 2020

Ваша оценка верна.

Поскольку global_foo объявлено static, каждый исходный файл имеет свою собственную отдельную переменную с тем же именем, и изменение одного не влияет на другое.

Из-за этого программа напечатает -1, поскольку global_foo в основном. c не изменяется.

2 голосов
/ 03 мая 2020

Глобальные переменные в любом случае имеют static длительность хранения, поэтому нет необходимости включать квалификатор static, чтобы явно указывать продолжительность хранения. Когда вы объявляете глобальную переменную как static в единице перевода, вы просто говорите, что она имеет внутреннюю связь внутри этой единицы перевода. Это означает, что он может быть идентифицирован только по имени в блоке перевода.

Итак, если вы объявите переменную как static в заголовочном файле, каждый включающий ее модуль перевода получит собственную копию переменной, которая отличается от всех остальных.

Если у вас есть функция, которая возвращает адрес переменной, т.е.

int *getStaticAddress () 
{
    return &static_var; 
}

. Вы можете использовать ее для доступа к переменной за пределами единицы перевода.

...