Разница между void main и int main?

Имеет ли значение, каким образом я объявляю свои программы на С++?

Ответы

Ответ 1

Разница в том, что один из них - правильный способ определения main, а другой - нет.

И да, это имеет значение.

int main(int argc, char** argv)

или

int main()

- это правильное определение вашего main для спецификации С++.

void main(int argc, char** argv)

не является и был, IIRC, извращением, которое пришло с компилятором Microsoft С++.

https://isocpp.org/wiki/faq/newbie#main-returns-int

Ответ 2

Бьярне Страуступс сделал это совершенно ясно:

"Определение void main() не является и никогда не было С++, и даже не было C."

http://www.stroustrup.com/bs_faq2.html#void-main

Ответ 3

Вы должны использовать int main. Оба стандарта C и С++ указывают, что main должен возвращать значение.

Ответ 4

Для С++ допускается только int. Для C C99 говорит, что допускается только int. Предыдущий стандарт допускал возврат пустоты.

Короче говоря, всегда int.

Ответ 5

Суть в том, что C-программы (и С++ одинаковые) всегда (должны?) возвращают значение успеха или код ошибки, поэтому они должны быть объявлены таким образом.

Ответ 6

В С++ 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; при столкновении с закрывающей скобкой.

Ответ 7

Если вы идете по спецификации, вы всегда должны объявлять main как int.

В действительности, однако, большинство компиляторов позволят вам обойтись без одного, так что реальная разница в том, хотите ли вы/нужно вернуть значение в оболочку.

Ответ 8

Давным-давно я нашел эту страницу (void main (void)), которая содержала много причин за пределами "стандарта" недействителен ". В определенных операционных системах/архитектурах это может привести к повреждению стека и другим неприятным вещам.