Странное поведение с внешней и статической связью переменных

Я нашел некоторое поведение с 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,

Другие вопросы по тегам