Если я объявляю static-функцию в глобальной области видимости, то она доступна только в этом файле, и её extern уже не получить. Если static-переменная будет внутри функции, то это понятно, память один раз выделяется за всё время пользования программы. Но я что-то не пойму, что значит static в глобальной области видимости.
Я думаю что static-переменная в глобальной области, это то же что и функция в глобальной области, что эту переменную нельзя использовать extern в другом файле. Потому что глобальная переменная и так как static выделяется один раз.
Да, вы правы. Если идентификатор объекта или функции объявлен в области видимости файла (англ. file scope) со спецификатором хранения static, то этот идентификатор будет иметь внутреннюю линковку (англ. internal linkage) и не будет «виден» внутри других единиц трансляции.
Например, имеем следующую ситуацию:
a.c:
#include <stdio.h>
#include "b.h"
int main(void)
{
extern int variable;
set_value(1000);
printf("%d\n", variable);
}
b.c:
#include "b.h"
int variable;
void set_value(const int v)
{
variable = v;
}
b.h:
#ifndef B_H
#define B_H
void set_value(const int);
#endif
Если внутри b.c объявить variable с ключевым словом static, то получим ошибку линковки:
/usr/bin/ld: /tmp/ccJguPPE.o: in function `main':
a.c:(.text+0x10): undefined reference to `variable'
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости