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