Почему int main () {} компилируется? - PullRequest
35 голосов
/ 22 августа 2008

(я использую Visual C ++ 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";
}

Может ли это быть ошибкой в ​​VC ++?

Ответы [ 4 ]

71 голосов
/ 22 августа 2008

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

....

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

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

и

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

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

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

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

17 голосов
/ 22 августа 2008

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

3 голосов
/ 22 августа 2008

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

1 голос
/ 16 августа 2010

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

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

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

int main(){
   f();
}

Таким образом, весь смысл в том, что 'main' является особенным, как указывалось в предыдущих ответах.

...