Почему вызов main() не разрешен в С++

C++03 3.6.1.3: Функция main не должна использоваться (3.2) внутри программы....

Интересно, почему это правило существует... Кто-нибудь знает о какой-либо системе/реализации, где это было бы проблемой, если main были использованы?

P.S. 1. Я знаю определение термина used. 2. Я знаю, что есть простые обходные пути, например, вызов одного MyMain() из main() и использование MyMain(). 3. Речь идет о реалиях реального мира, которые имели бы проблему, если бы ограничений там не было. Спасибо!

Ответ 1

В дополнение к другим ответам: спецификация С++ гарантирует, что вся статическая инициализация произошла до того, как вызывается main.

Если код мог вызвать main, то какой-то объект с статическими областями мог бы вызвать main, и в этом случае нарушена фундаментальная гарантия.

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

Ответ 2

Я бы предположил, что это сохраняет свободу реализации префикса main с кодом для построения глобальных и статических данных, принимает любые параметры, определяющие аргументы среды и командной строки, и сопоставляет их с соглашениями argc/argv/env на С++, конструирует соответствующий стек и инфраструктура исключений для приложения для выполнения и т.д. Учтите, что не все среды могут позволить исполняемому изображению иметь любой другой символ, обозначенный как код инициализации, который должен быть запущен до main().

Аналогично, код очистки может быть добавлен к main() вместе с вызовом ОС с некоторым отображением из соглашения 0/без нуля C и С++ с фактическими значениями успеха/отказа, используемыми этой конкретной ОС.

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

Ответ 3

С++ main() - это странная небольшая функция, которая имеет различный синтаксис для обработки исключений, не должна возвращать значение, даже если оно должно быть определено как возвращающее int и т.д. Я не знаю, влияет на любые реальные реализации, но я бы предположил, что существует ограничение, чтобы дать авторам компилятора некоторую широту в том, как они реализуют main().