Почему вызов main () не разрешен в C ++ - PullRequest
16 голосов
/ 10 ноября 2010

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

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

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

Ответы [ 3 ]

35 голосов
/ 10 ноября 2010

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

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

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

16 голосов
/ 10 ноября 2010

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

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

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

4 голосов
/ 10 ноября 2010

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

...