Имеет ли значение, каким образом я объявляю функцию main
в программе на C ++ (или C)?
Разница между void main и int main в C / с ++?
Ответы (8)
Разница в том, что один способ определения main
правильный, а другой - нет.
И да, это имеет значение. Либо
int main(int argc, char** argv)
or
int main()
являются правильным определением вашего main
согласно спецификации C ++.
void main(int argc, char** argv)
IIRC - это не так и было извращением, которое пришло со старыми компиляторами Microsoft C ++.
https://isocpp.org/wiki/faq/newbie#main-returns-int
Бьярн Страуструп совершенно ясно дал понять:
Определение
void main()
не является и никогда не было ни C ++, ни даже C.
См. ссылку.
Вы должны использовать int main
. Как стандарты C, так и C ++ определяют, что main
должен возвращать значение.
Для C ++ допускается только int. Для C C99 говорит, что разрешено только int. Предыдущий стандарт допускал void
доход.
Короче всегда int
.
Дело в том, что программы на C (и то же самое на C ++) всегда (должны?) Возвращать значение успеха или код ошибки, поэтому они должны быть объявлены таким образом.
Давным-давно я нашел эту страницу (void main (void)), которая содержал много причин помимо аргумента «стандарт говорит, что это недействительно». В определенных операционных системах / архитектурах это может привести к повреждению стека и другим неприятным вещам.
Если вы следуете спецификации, вы всегда должны объявлять main
, возвращая int
.
На самом деле, однако, большинство компиляторов позволят вам отказаться от любого из них, поэтому реальная разница в том, хотите ли вы / должны ли вы вернуть значение в оболочку.
В C ++ main()
должен возвращать int
. Однако C99 позволяет main()
иметь тип возврата, отличный от int
. Вот выдержка из стандарта C99.
5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется main. Реализация не объявляет прототип для этой функции. Он должен быть определен с возвращаемым типом int и без параметров:
int main(void) { /* ... */ }
или с двумя параметрами (называемыми здесь argc и argv, хотя можно использовать любые имена, поскольку они являются локальными для функции, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или аналогичный; или каким-либо другим способом, определяемым реализацией.
Также обратите внимание, что gcc компилирует void main()
, хотя на практике он делает return 0;
при встрече с закрывающей фигурной скобкой.
gcc -pedantic
, однако, отклонит его. А не использовать -pedantic
- это просто лажа.
- person Konrad Rudolph; 17.01.2010
gcc -pedantic
, значит ли это, что мы не используем стандартный C? Во-вторых, я был бы признателен, если вы мне скажете, где это написано.
- person Niraj Raut; 22.01.2021
gcc -pedantic
, значит ли это, что мы не используем стандартный C? Во-вторых, я был бы признателен, если вы мне скажете, где это написано.
- person Niraj Raut; 22.01.2021
-pedantic
или -pedantic-errors
. Нет абсолютно никаких причин для использования неправильного типа возврата, это просто небрежно (но обратите внимание, что у автономных реализаций C есть другие функции точки входа!).
- person Konrad Rudolph; 22.01.2021