Как вы предлагаете разрешить необъявленные идентификаторы, которые определены в другой единице перевода ?
C ++ не имеет понятия модуля, но имеет отдельный перевод как наследование от C. Компилятор C ++ сам скомпилирует каждый модуль перевода, ничего не зная о других модулях перевода вообще. (За исключением того, что export
сломал это, возможно, поэтому он, к сожалению, никогда не взлетел.)
Заголовочные файлы , где вы обычно помещаете объявления идентификаторов, которые определены в других единицах перевода, на самом деле являются просто очень неуклюжим способом вставки одних и тех же объявлений в разные единицы перевода. Они не сообщат компилятору о существовании других модулей перевода с определенными в них идентификаторами.
Редактировать Ваши дополнительные примеры:
Со всем текстовым включением вместо правильной концепции модуля компиляция уже мучительно долго для C ++, поэтому требуется еще один этап компиляции (когда компиляция уже разбита на несколько этапов, не все из которых можно оптимизировать и объединить, IIRC) ухудшит уже плохая проблема. И изменение этого значения, вероятно, изменит разрешение перегрузки в некоторых сценариях и, таким образом, нарушит существующий код.
Обратите внимание, что C ++ требует дополнительного прохода для синтаксического анализа определений классов, поскольку функции-члены, определенные встроенными в определение класса, анализируются, как если бы они были определены прямо за определением класса. Тем не менее, это было решено, когда был придуман язык C с классами, поэтому существующей кодовой базы не было.