Странное поведение с внешней и статической связью переменных
Я нашел некоторое поведение с extern
а также static
(внутренние) переменные, которые я нахожу довольно странными.
Вот пример:
/* file a.c */
#include <stdio.h>
/* variable with static linkage */
static int x = 24;
int f() {
/* variable with extern linkage */
extern int x;
return x;
}
int main() {
printf("%d\n", f());
return 0;
}
-
/* file x.c */
/* define symbol `x` to be an `int` equal to 100 */
int x = 100;
Я компилирую эту программу, используя:
$ cc a.c x.c -o a
Затем я запускаю свою программу и получаю такой вывод:
$ ./a
24
Почему эта программа выводит 24
и не 100
?
1 ответ
Цитирование по ссылке
В следующей таблице указана связь, назначенная объекту, который объявляется дважды в одной единице перевода. Столбец обозначает первое объявление, а строка обозначает переопределение.
Также из стандартного раздела 6.2.2:
Для идентификатора, объявленного с помощью спецификатора класса хранения extern в области видимости, в котором видно предыдущее объявление этого идентификатора, если в предыдущем объявлении указана внутренняя или внешняя связь, связь идентификатора в более позднем объявлении такая же, как и связь указано в предыдущей декларации. Если никакое предыдущее объявление не видно или если в предыдущем объявлении не указана связь, то идентификатор имеет внешнюю связь.
Отсюда файл a.c
все внешние связи разрешены внутри. Ваш код определил x
сначала как статическое, а затем как внешнее в блоке преобразования ac. Следовательно, связь является внутренней из таблицы выше. Так что печатает 24
,