Почему "extern int &c" работает нормально?

В C++ необходимо инициализировать ссылочную переменную. int &a; / / ошибка

static int &b; // Error

но

extern int &c; // No error

почему компилятор не выдаст ошибку extern описатель ссылки?

3 ответов


на extern ключевое слово-это директива для компилятора, который теперь объявляет символ, который будет заполнен во время связывания, взятый из другого объектного файла. Ожидается, что инициализация произойдет там, где определен фактический символ.

если у вас есть a.C файл с

int foo;
int &bar = foo;

и b.C файл с

extern int &bar;

при компиляции файла b.c в b.o компилятор оставит символ для bar пустой. При связывании программы компоновщик нужно будет найти экспортированный символ bar В a.o и затем заменит пустой символ в b.o с bar из.о

если компоновщик не может найти необходимый символ в любом месте связанных объектных файлов-будет выдана ошибка компоновщика (не ошибка компилятора).


почему компилятор не выдаст ошибку extern ссылка?

, потому что extern int &c; это не определение, а просто декларация. Он сообщает компилятору, что c будет определено где-то еще в программе.

на страница cppreference на "спецификаторах классов хранения" объясняет значение extern в этом случае.


спецификация языка явно говорит

8.3.2 ссылок
5 [...] Объявление ссылки должно содержать инициализатор (8.6.3), за исключением случаев, когда объявление содержит явное extern спецификатор (7.1.1), является объявлением члена класса (9.2) в определении класса или объявлением параметр или тип возврата (8.3.5); см. 3.1.

ваша ситуация напрямую этот цитата. Другими словами, ссылки не исключаются из общего правила определения декларации. Можно создать объявление без определения для ссылки, определенной (и инициализированной) в другом месте.

никто не запрещает вам включать инициализатор в ссылочное объявление с явным extern ключевое слово. Однако, как обычно, он превратит неопределяющее объявление в определение.