Почему "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 ключевое слово. Однако, как обычно, он превратит неопределяющее объявление в определение.