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

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

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

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


person Armen Tsirunyan    schedule 10.11.2010    source источник
comment
IIRC, в C нет такого ограничения, поэтому я бы сказал, что нет.   -  person avakar    schedule 10.11.2010
comment
Я думаю, это означает, что main не будет вызываться никаким фрагментом кода в вашей программе (иначе он просто загрузит сам вершину).   -  person leppie    schedule 10.11.2010
comment
Возможный дубликат Может ли основная функция вызывать себя в C++?   -  person phuclv    schedule 26.08.2016
comment
Поздно на вечеринку, но если в течение 10 лет никто не придумал реализацию, в которой явный вызов main() был бы проблемой, я думаю, ответ будет отрицательным:   -  person Peter - Reinstate Monica    schedule 19.12.2020


Ответы (3)


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

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

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

person Chris Becke    schedule 10.11.2010

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

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

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

person Tony Delroy    schedule 10.11.2010

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

person Marcelo Cantos    schedule 10.11.2010