Почему int main() {} компилируется?

(Я использую Visual С++ 2008). Я всегда слышал, что main() требуется для возвращения целого числа, но здесь я не помещал в return 0; и скомпилировал его с 0 ошибками и 0 предупреждениями! В окне отладки говорится, что программа вышла с кодом 0. Если эта функция называется чем-то другим, кроме main(), компилятор жалуется, что "blah" должен вернуть значение. При нажатии кнопки 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С++?

Ответы

Ответ 1

3.6.1 Основная функция

....

2 Реализация не должна предопределять функцию main. Эта функция не должна быть перегружена. Он должен иметь тип возвращаемого типа int, но в противном случае его тип определяется реализацией. Все реализации должны допускать оба следующих определения main:

int main() { /* ... */ }

и

int main(int argc, char* argv[]) {
/* ... */
}

.... и он продолжает добавлять...

5 Оператор return в main имеет эффект оставления основной функции (уничтожения любых объектов с автоматической продолжительностью хранения) и вызова exit с возвращаемым значением в качестве аргумента. Если элемент управления достигает конца main, не встречая оператора return, эффект заключается в выполнении возврата 0;

попытка найти онлайн-копию стандарта С++, чтобы я мог процитировать этот отрывок Я нашел сообщение в блоге, которое цитирует все правильные биты лучше, чем я мог.

Ответ 2

Это часть стандарта языка С++. Неявный возврат 0 генерируется для вас, если нет явного оператора return в main.

Ответ 3

Я уверен, что VС++ просто вставляет возврат 0, если вы не включаете его в основные функции. То же самое может случиться и с функциями, но в тех случаях, по крайней мере, вы получите предупреждение.

Ответ 4

В разделе 6.6.3/2 говорится: "Выключение конца функции эквивалентно возврату без значения, что приводит к поведению undefined в возвращающей значение функции".

Примером является приведенный ниже код, который в лучшем случае дает предупреждение о VS 2010/g++

int f(){
   if(0){
      if(1)
         return true;
   }
}

int main(){
   f();
}

Итак, все дело в том, что "главное" является особенным, как указывали предыдущие ответы.