#include <stdio.h>
static int b;
int main()
{
{
int b;
{
extern int b;
b = 2;
}
}
printf("%d", b);
}
Здесь по определению идентификатор «B», который присваивается значение 2 должен иметь быть один с внешним связыванием. Однако по какой-то причине компилятор «clang» C не жалуется, а выход этого кода равен «2».
Я принимаю это из-за $ 6.2.2.4 точки в стандарте C:
для идентификатора объявленного с хранением класса спецификатором экстерном в области применения, в котором перед декларацией этого идентификатора visible, 31) , если в предыдущем объявлении указывается внутренняя или внешняя связь, ссылка идентификатора в следующем объявлении совпадает с ссылкой , указанной в предыдущем объявлении. Если никакое предыдущее объявление не отображается , или если в предыдущем объявлении не указана связь, то идентификатор имеет внешнюю связь.
И поскольку предыдущее видимое объявление не указывает никакой привязки ('int b').
Во всяком случае, как я могу сделать объявление перед назначением ссылкой на идентификатор с внутренней связью (вместо той, которая имеет внешний такой).
Редактировать: Я вижу, что этот пример UB, но это не меняет мой вопрос.
Могу ли я спросить, за что это было проголосовано? – AnArrayOfFunctions