static в глобальной области видимости

61
25 февраля 2022, 17:40

Если я объявляю static-функцию в глобальной области видимости, то она доступна только в этом файле, и её extern уже не получить. Если static-переменная будет внутри функции, то это понятно, память один раз выделяется за всё время пользования программы. Но я что-то не пойму, что значит static в глобальной области видимости.

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

Answer 1

Да, вы правы. Если идентификатор объекта или функции объявлен в области видимости файла (англ. 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'
READ ALSO
MySql после установки на Centos 7 не запускается

MySql после установки на Centos 7 не запускается

Устанавливаю MySql на Centos7 следующим образомСначала скачиваю

101
индексы в mysql

индексы в mysql

как известно, если в таблицу добавляется запись, то пересчитываются индексы и сбрасывается кэш запросов, чем больше таблица - тем больше времени...

107
Ошибка при выводе шифрования столбца таблицы при помощи AES шифрования и кодировке BASE 64 от имени пользователя

Ошибка при выводе шифрования столбца таблицы при помощи AES шифрования и кодировке BASE 64 от имени пользователя

При работе с таблицей от имени пользователя шифрую и кодирую записи таблицы, при этом все хорошо выводит

98
MySQL. Выбор времени работы с - по и общее время

MySQL. Выбор времени работы с - по и общее время

Необходимо посчитать общее время работы оборудования в разных промежуткахК примеру приходят следующие данные:

196