Что было не так с void main ()? - PullRequest
17 голосов
/ 25 февраля 2012

Почему установка типа возврата точки входа на void в C ++ всегда не поощрялась, а впоследствии была удалена стандартом и запрещена современными компиляторами?Почему это считается плохой практикой?

Теперь, насколько я понимаю, C # и Java оба позволяют типу возвращаемой точки входа быть void т.е.

static void main(String[] args) /* Java */
static void Main(string[] args) /* C# */

А C # и Java-программисты этого не делаютсчитают это плохой практикой, они часто используют ее на самом деле.

Другие языки, которые (только предназначены , я сомневаюсь, что C ++ будет успешным в этом десятилетии, по крайней мере) станут возможными наследникамиC ++, такой как язык программирования D или Vala, также допускает void main().Итак, как вы можете видеть, я сомневаюсь, что сообщество C ++ удалило его из стандарта, потому что оно было слишком неясным или непопулярным.

Итак, мой вопрос: почему сообщество C ++ удалило void main()?Что с ним не так?

Ответы [ 4 ]

10 голосов
/ 25 февраля 2012

Комитет по стандартам C ++, вероятно, решил потребовать int main() из-за большого объема существующего кода, который ожидал использовать оператор return для возврата определенного кода завершения в систему времени выполнения. Было бы неразумно ожидать, что вместо всего существующего кода будет использоваться exit(), поэтому в стандарте int main() было сделано требование.

У такого языка, как Java, при его разработке не было никакого существующего кода, с которым он должен был бы быть совместимым. Поэтому разработчики могут выбрать void main() и потребовать использования System.exit() для ненулевых кодов выхода.

Итак, что было бы «неправильно» при выборе void main() для стандарта C ++, так это то, что он сломал бы существующий код, который должен использовать return, и значение кода выхода из main().

10 голосов
/ 25 февраля 2012

C ++ имеет никогда разрешено void main(), хотя некоторые компиляторы могут разрешить это либо как расширение, либо просто потому, что не диагностируют его.

Точно так же C никогда не разрешал void main(), кроме как в качестве расширения; тот же стандарт 1989 года, в котором было введено ключевое слово void, определил два стандартных определения для main: int main(void) и int main(int argc, char *argv[]).

Другие языки допускают это, потому что, ну, это другие языки.

Нет особого преимущества в возможности писать void main(), а не int main(). Вам даже не нужно явно возвращать значение; падение в конце main эквивалентно return 0; (в C ++ и в C, начиная с C99).

8 голосов
/ 25 февраля 2012

Как правило, вы хотите знать статус выхода вашей программы.Вот почему у вас есть int main() - вы возвращаете свой статус выхода.

3 голосов
/ 25 февраля 2012

Это неправильно, потому что это не то, что Стандарт C ++ определяет как законный main. Никого не волнует, что указывают другие языки. Для программ на C ++ важен только стандарт C ++, в котором говорится int.

...