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