Можете ли вы опустить тип возврата в основной функции?
Существуют ли специальные правила относительно объявления функции 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" возвращается, но где функция возвращаемого типа будет неактуальна, если функция никогда не вернется, может быть разумным и целесообразным объявить "главную" как функцию "пустота", поскольку она никогда не будет верните значение.