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

(Я использую 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 ответа

Решение

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

....

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

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

а также

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

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

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

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

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

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

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

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

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

int main(){
   f();
}

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

Другие вопросы по тегам