Можете ли вы опустить тип возврата в основной функции?

Существуют ли специальные правила относительно объявления функции main?

В соответствии с ideone это законно С++:

main()  // As opposed to int main()
{
   return 0;
}

С другой стороны, нормальные функции, похоже, не имеют привилегий, чтобы избежать возвращаемого типа:

f(){} 

int main()
{
    return 0;
}

Дает ошибку:

prog.cpp: 1: 3: ошибка: ISO С++ запрещает объявление 'f' без типа [-fpermissive] f() {} ^

Является ли функция main особенной в этом случае?

Ответы

Ответ 1

Никогда не опускайте возвращаемый тип main, поскольку он нестандартен!


пример wandbox:

prog.cc:1:6: предупреждение: ISO С++ запрещает объявление 'main' без типа [-Wpedantic]  Основной()


От $3.6.1:

1 Программа должна содержать глобальную функцию main, которая является назначенным началом программы. Это является ли реализация определена, требуется ли программа в автономной среде для определения основной функция. [Примечание. В автономной среде запуск и завершение определяются положением; запускать содержит выполнение конструкторов для объектов области пространства имен со статической продолжительностью хранения; завершение содержит выполнение деструкторов для объектов со статической продолжительностью хранения. - конечная нота] § 3.6.1 58

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

Ответ 2

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

Ответ 3

идеон ошибается.

Старые версии C (pre-standard и стандарт 1989) поддерживали неявный int тип возврата из функции. Это незаконно в C с 1999 года.

Нет стандарта С++ поддерживает неявный тип возврата int. Фактически, неявный int был "запрещен" в ARM (Справочное руководство Annotated С++ Маргарет Эллис и Бьярн Страуструп). ARM был одним из ключевых документов, который руководил разработкой первого стандарта С++.

Ответ 4

В С++ он недействителен, за исключением нескольких старых компиляторов С++, таких как Turbo С++. Каждая функция должна указывать тип возврата в С++.

См. ссылку ссылки: http://www.geeksforgeeks.org/implicit-return-type-int-c-language/

Ответ 5

Для Old C он был поддержан логикой позади него - когда main() завершает его, явным образом возвращает 0, что означает, что программа была успешной. Значение int, которое обычно возвращает, обычно является значением, которое будет передано обратно в операционную систему.

Ответ 6

Стандарт предписывает, как размещенная реализация должна рассматривать программы, где "main" возвращает "int". Он не указывает точно, что должна делать реализация, когда возвращается "main" , но это сильно означает, что если "main" возвращает ноль, реализация должна делать все, что "нормально" для базовой платформы. Он не предписывает, как реализации должны обрабатывать программы, где "main" возвращает что-то еще; реализации могут свободно вести себя или нет, на досуге.

Внедряющим реализациям разрешено указывать, что "главное" никогда не должно возвращаться и что могут произойти любые плохие вещи, если это произойдет. Стандарт не предписывает какую-либо конкретную альтернативную форму обращения, но подразумевает, что реализации могут с пользой поддерживать такие формы. Существуют платформы, где вызов функции "void" кодом, который ожидает, что он вернет "int", вызовет странные и сумасшедшие поведения независимо от того, действительно ли функция возвращается, но есть много, где ничего странного не произойдет. В автономной реализации, которая будет вести себя плохо, если "main" возвращается, но где функция возвращаемого типа будет неактуальна, если функция никогда не вернется, может быть разумным и целесообразным объявить "главную" как функцию "пустота", поскольку она никогда не будет верните значение.