Внутренняя связь со статическим ключевым словом в C

Я знаю, что static является перегруженным ключевым словом в C. Здесь меня интересует только его использование в качестве ключевого слова для обеспечения внутренней связи.

Если у вас есть глобальная переменная, объявленная в файле .c , в чем разница между использованием static и не использованием static ? В любом случае, никакой другой файл .c не имеет доступа к переменной, поэтому переменная в основном является «закрытой» для файла с ключевым словом static или без него.

Например, если у меня есть файл foo.c , и я объявляю глобальную переменную:

int x = 5;

Эта переменная x только доступно для кода внутри foo.c (если, конечно, я не объявил его в каком-то файле общего заголовка с ключевым словом extern ). Но если я не t объявить его в заголовочном файле, какая разница, если бы я набрал:

static int x = 5 .

В любом случае, кажется, что x имеет здесь внутреннюю связь , Поэтому я запутался в отношении цели static в этом отношении.

11
задан Channel72 19 August 2010 в 19:38
поделиться

2 ответа

Если у вас есть глобальная переменная, объявленная в файле .c , в чем разница между использованием static и неиспользованием static ? В любом случае, никакой другой файл .c не имеет доступа к переменной [...]

Другой файл может объявить x :

extern int x;

Это позволит код ссылаясь на x для компиляции, и компоновщик с радостью свяжет эти ссылки с любыми найденными x .

static предотвращает это, не позволяя x быть видимым за пределами его единицы перевода.

12
ответ дан 3 December 2019 в 06:44
поделиться

Существует только одно «пространство имен», так сказать, в C. Без ключевого слова «static» вы не защищены от другого файла, использующего имя «x» (даже если вы не сделайте его видимым в заголовке вашей собственной библиотеки).

Попробуйте связать вместе несколько файлов C, содержащих нестатическую переменную x (чередование операций чтения и записи из функций в каждом файле), и сравните с ситуацией, когда эти переменные объявлены статическими.

6
ответ дан 3 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

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