Является ли законным возвращаться в main() на С++?

Я читал, что стандарт С++ запрещает рекурсию в main(), но g++ компилирует следующий код без жалобы:

int main()
{
    main();
}

Кто-нибудь может это прояснить?

Ответ 1

Согласно стандарту в 3.6.1/3, это не:

Функция main не используется(3.2) внутри программы

Определение используемого существа:

Объект или не перегруженный функция используется, если ее имя отображается в потенциально оцениваемом выражении.

Ответ 2

Я сделаю рыбу и объясню, почему это вербот. Прежде чем программа C или С++ начнет работу, сначала необходимо инициализировать ЭЛТ. Откройте stdin/out/err, инициализаторы вызовов, что-то типа. Есть две основные стратегии, чтобы сделать это, детальную детализацию платформы.

  • Начальный адрес программы указывает на функцию init CRT, которая в конечном итоге вызывает main(). Общие для полнофункциональных операционных систем, которые имеют фантастический загрузчик, который может поддерживать произвольные разделы исполняемого образа.

  • Компилятор вводит код в функцию main(), которая вызывает функцию инициализации CRT. Функция начала всегда main(). Общие на встроенных платформах с ограниченными возможностями загрузчика. Рекурсивный main() теперь является проблемой, код запуска CRT будет вызван снова с непредсказуемым состоянием стека.

Ответ 3

Заявка здесь заключается в том, что это действительно специально запрещено:

Ну, стандартное состояние:

3.6.1.3
"Функция main не должна использоваться внутри программы".

5.2.2.9
"Разрешены рекурсивные вызовы, за исключением функции с именем main"

Вы можете, конечно, сделать это:

int main(int argc, char* argv[]) {
    return foo(argc, argv);
}
int foo(int argc, char* argv[]) {
    if (some_condition) {
        return foo(argc, argv);
    }
    return 0;
}

(Примечание: я добавил предложение get-out. Я даже не могу гипотетически кодировать бесконечную рекурсию, она повторяется на мне.)

Ответ 4

Это не законно. Прочтите 3.6.1-3:

Функция main не должна использоваться (3.2) внутри программы. Связь (3.5) основного реализации. Программа, которая объявляет, что основной является встроенным или статическим плохо сформирован. Название main не иначе зарезервировано. [Пример: член функции, классы и перечисления можно назвать основным, так как объекты в другие пространства имен. ]

Ответ 5

Другие люди обратились к части стандартов. Тем не менее, я хотел бы отметить, что g++ (не менее 4.6.2) отклонит это, если вы используете -pedantic-errors с хотя бы одной из этих ошибок (в зависимости от main signature):

error: ISO C++ forbids calling ‘::main’ from within program [-pedantic]
error: ISO C++ forbids taking address of function ‘::main’ [-pedantic]