Почему вызов 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()
.