Я пытаюсь понять, что произойдет, если в какой-то программе у нас будет так:
extern int x;
void foo(){...}
void bar(){...}
void main(){
foo();
bar();
}
int x=0;
Так что же должно произойти? Почему разрешено иметь две такие переменные с одинаковыми именами? Они разные?
int x; int x; int x = 3; extern int x;
. Даже с очень суетливыми параметрами, установленными для GCC, он компилируется. Переместите строкуextern
наверх, иclang -Weverything
примет ее. Первые дваint x;
являются предварительными определениями.int x = 3;
— это не предварительное (окончательное?) определение. Вы не могли повторить это или использовать другой инициализатор. Если бы к концу файла не было окончательного определения,int x;
было бы преобразовано в одно. - person Jonathan Leffler   schedule 09.02.2017extern
. То есть нет никакой разницы между переменными, которые вы называете внешними, и переменными, которые вы называете глобальными. Однако наличие или отсутствиеextern
может иметь значение и в других отношениях. - person John Bollinger   schedule 09.02.2017