Я знаю, что static
является перегруженным ключевым словом в C. Здесь меня интересует только его использование в качестве ключевого слова для обеспечения внутренней связи.
Если у вас есть глобальная переменная, объявленная в файле .c
, в чем разница между использованием static
и не использованием static
? В любом случае, никакой другой файл .c
не имеет доступа к переменной, поэтому переменная в основном является «закрытой» для файла с ключевым словом static или без него.
Например, если у меня есть файл foo.c
, и я объявляю глобальную переменную:
int x = 5;
Эта переменная x
только доступно для кода внутри foo.c
(если, конечно, я не объявил его в каком-то файле общего заголовка с ключевым словом extern
). Но если я не t объявить его в заголовочном файле, какая разница, если бы я набрал:
static int x = 5
.
В любом случае, кажется, что x
имеет здесь внутреннюю связь , Поэтому я запутался в отношении цели static
в этом отношении.
Если у вас есть глобальная переменная, объявленная в файле
.c
, в чем разница между использованиемstatic
и неиспользованиемstatic
? В любом случае, никакой другой файл.c
не имеет доступа к переменной [...]
Другой файл может объявить x
:
extern int x;
Это позволит код ссылаясь на x
для компиляции, и компоновщик с радостью свяжет эти ссылки с любыми найденными x
.
static
предотвращает это, не позволяя x
быть видимым за пределами его единицы перевода.
Существует только одно «пространство имен», так сказать, в C. Без ключевого слова «static» вы не защищены от другого файла, использующего имя «x» (даже если вы не сделайте его видимым в заголовке вашей собственной библиотеки).
Попробуйте связать вместе несколько файлов C, содержащих нестатическую переменную x
(чередование операций чтения и записи из функций в каждом файле), и сравните с ситуацией, когда эти переменные объявлены статическими.