Что было неправильно с void main()?
Почему настройка типа возвращаемой точки на void
в С++ всегда была обескуражена и впоследствии была удалена стандартом и запрещена современными компиляторами? Почему это считается плохой практикой?
Теперь, поскольку я понимаю, что С# и Java позволяют возвращать тип возвращаемой точки void
i.e
static void main(String[] args) /* Java */
static void Main(string[] args) /* C# */
И программисты на С# и Java не считают это плохой практикой, они часто используют его.
Другие языки, которые (только для того, чтобы быть, я сомневаюсь, что С++ будет успешным в этом десятилетии, по крайней мере) возможные преемники С++, такие как язык программирования D или Vala, также позволяют void main()
. Итак, как вы можете видеть, я сомневаюсь, что сообщество С++ удалило его из стандарта, потому что оно было слишком неясным или непопулярным.
Итак, мой вопрос: почему С++ Community Remove void main()
? Что случилось с этим?
Ответы
Ответ 1
Комитет по стандартам на C++, скорее всего, предпочел бы потребовать int main()
из-за большого объема существующего кода, который, как ожидается, будет использовать оператор return
для возврата определенного кода выхода в систему выполнения. Было бы необоснованным ожидать, что весь существующий код изменится для использования exit()
вместо этого, поэтому int main()
было принято требование в стандарте.
Язык, такой как Java, когда он был спроектирован, не имел ни одного существующего кода, для которого он должен был оставаться совместимым. Поэтому дизайнеры могли выбрать void main()
и потребовать использования System.exit()
для ненулевых кодов выхода.
Итак, вещь, которая была бы "неправильной" при выборе void main()
для стандарта С++, заключалась бы в том, что она сломала существующий код, который ожидал использовать return
, и значение кода выхода из main()
.
Ответ 2
С++ никогда не разрешал 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, начиная с C99).
Ответ 3
Обычно вы хотите узнать статус выхода своей программы. Вот почему у вас есть int main()
- вы возвращаете свой статус выхода.
Ответ 4
Это неправильно, потому что это не то, что стандарт С++ указывает на юридический main
. Никто не заботится о том, что указывают другие языки. Для программ на С++ актуальным является только стандарт С++, и он говорит int
.