Изменить
И в C, и в C ++ наличие extern
указывает, что первое объявление не является определением. Следовательно, он просто делает имя доступным в текущей единице перевода (любому, кто включает заголовок) и указывает, что упомянутый объект имеет внешнюю связь, то есть доступен во всех единицах перевода, составляющих программу. Это не говорит о том, что объект обязательно находится в другой единице перевода - просто «эта строка не является определением».
Завершить редактирование
В C extern
не является обязательным. Без него первое объявление является «предварительным определением». Если бы не более позднее определение (которое однозначно является определением, потому что у него есть инициализатор), это рассматривалось бы как определение (C99 6.9.2). Как бы то ни было, это просто декларация и не противоречит.
В C ++ extern
не является необязательным - без него первое объявление является определением (C ++ 03 3.1), которое конфликтует со вторым.
Это различие явно указано в Приложении C к C ++:
"Изменение: C ++ не имеет" предварительных определений ", как в C
Например, в области файла
int i;
int i;
допустимо в C, недопустимо в C ++. "
person
fizzer
schedule
25.03.2009