В соответствии со стандартом C:
В наборе единиц перевода и библиотеках, составляющих всю программу, каждый объявление определенного идентификатора с внешняя связь обозначает тот же объект или функция. В пределах одной единицы перевода каждое объявление идентификатора с внутренний связь обозначает тот же объект или функцию. Каждое объявление идентификатора с нет связь обозначает уникальный объект.
В моем примере у нас есть три отдельных объявления с каждым идентификатором, имеющим другую ссылку. Поэтому почему это не работает?
static int a; //a_Internal
int main(void) {
int a; //a_Local
{
extern int a; //a_External
}
return 0;
}
Ошибка:
В функции "main": Строка 9: ошибка: переменная, ранее объявленная "статическая" переопределенная "extern"
Почему компилятор настаивает на том, что я обновляюсь, а не пытаюсь получить доступ к внешнему объекту в другом файле?
Действительный пример С++ для справки:
static void f();
static int i = 0; // #1
void g() {
extern void f(); // internal linkage
int i; // #2 i has no linkage
{
extern void f(); // internal linkage
extern int i; // #3 external linkage
}
}
Как Clang, так и VC, похоже, в порядке с моим примером; только некоторые версии GCC (не все) производят вышеупомянутую ошибку.