Допустим, у меня есть следующие настройки в C++ программы, в глобальном масштабе/пространства имен (вне любого блока):Экстерн Const, что декларация и которая является опережающим объявлением
Ситуации 1:
a.cpp
extern const int i=5;
b.cpp
extern const int i;
Есть два способа, на мой взгляд, что компилятор мог это видеть. Один из них заключается в том, что истинное объявление i находится в b.cpp, а a.cpp имеет просто объявление вперед и инициализацию. (Поскольку мы знаем, что для конкретных extern consts инициализация во время объявления не требуется). Другой возможный исполняемый файл, который мог бы сгенерировать компилятор, должен иметь a.cpp, содержащий истинное объявление, с инициализацией и утверждение в b.cpp как прямое объявление, просто требуется, чтобы он помог компилятору узнать, что я есть.
Как компилятор определяет, какой файл отвечает за фактическое объявление, и, следовательно, распределение памяти, связанное с i? Это может иметь внешне наблюдаемые эффекты, если вместо int использовался тип с интересным конструктором.
Как ответ на этот вопрос изменения, если вообще, с:
ситуации 2:
a.cpp
extern const int i;
extern const int i=5;
b.cpp
extern const int i;
Вы объявляете это 'extern', и вы также говорите, что знаете его значение. Это кажется неправильным. – tadman
@tadman При компиляции ошибок нет. Почему это неправильно? Я думал, что «extern» означает, что имя идентификатора имеет внешнюю связь. Это также означает, что вы не можете инициализировать его до известного значения? – Jeff
Обычно 'extern' означает« хранится в другом файле », и компоновщик позаботится о его синхронизации. Как вы все это компилируете? – tadman