Имеет ли значение, каким образом я объявляю свои программы на С++?
Разница между void main и int main?
Ответ 1
Разница в том, что один из них - правильный способ определения main
, а другой - нет.
И да, это имеет значение.
int main(int argc, char** argv)
или
int main()
- это правильное определение вашего main
для спецификации С++.
void main(int argc, char** argv)
не является и был, IIRC, извращением, которое пришло с компилятором Microsoft С++.
Ответ 2
Бьярне Страуступс сделал это совершенно ясно:
"Определение void main()
не является и никогда не было С++, и даже не было C."
Ответ 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)), которая содержала много причин за пределами "стандарта" недействителен ". В определенных операционных системах/архитектурах это может привести к повреждению стека и другим неприятным вещам.