Почему int main() {} компилируется?
-
09-06-2019 - |
Вопрос
(Я использую Visual C++ 2008). Я всегда слышал, что функция main() необходимый чтобы вернуть целое число, но здесь я не вставил return 0;
и он скомпилировался с 0 ошибками и 0 предупреждениями!В окне отладки пишет, что программа завершилась с кодом 0.Если эта функция называется иначе, чем main(), компилятор жалуется, говоря, что «бла» должно возвращать значение.Приклеивание return;
также приводит к появлению ошибки.Но если его полностью исключить, он компилируется нормально.
#include <iostream>
using namespace std;
int main()
{
cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}
Может ли это быть ошибка в VС++?
Решение
3.6.1 Основная функция
....
2 Реализация не должна заранее определять
main
функция.Эту функцию нельзя перегружать.Он должен иметь возвращаемый тип типаint
, но в остальном его тип определяется реализацией.Все реализации должны допускать оба следующих определения main:int main() { /* ... */ }
и
int main(int argc, char* argv[]) { /* ... */ }
....и продолжает добавляться...
5 А
return
заявление вmain
имеет эффект выхода из основной функции (уничтожения любых объектов с автоматической продолжительностью хранения) и вызоваexit
с возвращаемым значением в качестве аргумента. Если управление достигает концаmain
без оператора возврата, эффект заключается в выполнении возврата 0;
пытаюсь найти онлайн-копию стандарта C++, чтобы процитировать этот отрывок Я нашел сообщение в блоге, в котором все нужные моменты цитируются лучше, чем я мог бы.
Другие советы
Это часть стандарта языка C++.Неявный возврат 0 генерируется для вас, если в main нет явного оператора возврата.
Я почти уверен, что VC++ просто вставляет возвращаемый 0, если вы не включаете его в основные функции.То же самое может произойти и с функциями, но в таких случаях вы, по крайней мере, получите предупреждение.
В разделе 6.6.3/2 говорится: «Выход из конца функции эквивалентен возврату без значения;это приводит к неопределенному поведению функции, возвращающей значение.».
Примером является код ниже, который в лучшем случае выдает предупреждение о VS 2010/g++.
int f(){
if(0){
if(1)
return true;
}
}
int main(){
f();
}
Итак, весь смысл в том, что «main» является особенным, как указывалось в предыдущих ответах.