Я читал, что стандарт С++ запрещает рекурсию в main()
, но g++ компилирует следующий код без жалобы:
int main()
{
main();
}
Кто-нибудь может это прояснить?
Я читал, что стандарт С++ запрещает рекурсию в main()
, но g++ компилирует следующий код без жалобы:
int main()
{
main();
}
Кто-нибудь может это прояснить?
Согласно стандарту в 3.6.1/3, это не:
Функция
main
не используется(3.2) внутри программы
Определение используемого существа:
Объект или не перегруженный функция используется, если ее имя отображается в потенциально оцениваемом выражении.
Я сделаю рыбу и объясню, почему это вербот. Прежде чем программа C или С++ начнет работу, сначала необходимо инициализировать ЭЛТ. Откройте stdin/out/err, инициализаторы вызовов, что-то типа. Есть две основные стратегии, чтобы сделать это, детальную детализацию платформы.
Начальный адрес программы указывает на функцию init CRT, которая в конечном итоге вызывает main(). Общие для полнофункциональных операционных систем, которые имеют фантастический загрузчик, который может поддерживать произвольные разделы исполняемого образа.
Компилятор вводит код в функцию main(), которая вызывает функцию инициализации CRT. Функция начала всегда main(). Общие на встроенных платформах с ограниченными возможностями загрузчика. Рекурсивный main() теперь является проблемой, код запуска CRT будет вызван снова с непредсказуемым состоянием стека.
Заявка здесь заключается в том, что это действительно специально запрещено:
Ну, стандартное состояние:
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. Я даже не могу гипотетически кодировать бесконечную рекурсию, она повторяется на мне.)
Это не законно. Прочтите 3.6.1-3:
Функция main не должна использоваться (3.2) внутри программы. Связь (3.5) основного реализации. Программа, которая объявляет, что основной является встроенным или статическим плохо сформирован. Название main не иначе зарезервировано. [Пример: член функции, классы и перечисления можно назвать основным, так как объекты в другие пространства имен. ]
Другие люди обратились к части стандартов. Тем не менее, я хотел бы отметить, что 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]