Чтобы быть педантичным: в C нет глобальных переменных. Переменные имеют область действия, продолжительность хранения и связь. Ни для одного из них не существует «глобальной» квалификации.
Так что же происходит? Ваш
int my_private_value;
— это переменная с областью файла и внешней связью (и длительностью статического хранения). Этот тип связи означает, что на него можно ссылаться из любого другого файла, в области действия которого есть объявление extern int my_private_value
. Чтобы избежать этого, переменная должна иметь внутреннюю связь. Чтобы объявить переменную с внутренней связью, используйте ключевое слово static
:
static int my_private_value;
Итак, если вы хотите звучать как профессионал, всякий раз, когда вы испытываете искушение произнести «глобальную переменную», сделайте глубокий вдох и произнесите слова объект с областью действия файла и внешней связью. Это заставит вас блистать на всех собеседованиях C :-)
Если кто-то усомнится в вашей мудрости по поводу отсутствия «глобальных» переменных, вы даже можете доказать им это. Глобальные переменные находятся в области видимости везде, верно? Но в C область видимости объекта начинается только после его объявления. Отсутствие действительно глобальной переменной делает невозможным перенаправление ссылки на переменную, как в
int *foo = &bar; /* Doesn't work in C: bar is not (yet) in scope. */
int bar = 42;
Это действительно работает, когда вы меняете местами две строки.
person
Jens
schedule
15.09.2012