Внутренняя связь со статическим ключевым словом в C - PullRequest
11 голосов
/ 19 августа 2010

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

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

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

int x = 5;

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

static int x = 5.

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

Ответы [ 2 ]

12 голосов
/ 19 августа 2010

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

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

extern int x;

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

static предотвращает это, предотвращая видимость x за пределами блока перевода.

6 голосов
/ 19 августа 2010

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

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

...