Имеет ли значение, каким образом я объявляю свои программы на C++?Разница между void main и int main?
ответ
Разница заключается в том, что это правильный способ определения main
, а другой нет.
И да, это имеет значение.
int main(int argc, char** argv)
или
int main()
является правильное определение вашего main
на С ++ спецификации.
void main(int argc, char** argv)
не был и, IIRC, извращенность, который пришел с компилятором от Microsoft C++.
Для C++, только ИНТ допускается. Для C C99 говорит, что допускается только int. Предыдущий стандарт допускал возврат пустоты.
Короче говоря, всегда инт.
Возвращение int также требуется для C89. –
На самом деле, C89 является неопределенным в зависимости от того, как вы его читаете. Интересное чтение здесь: http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – Joe
, которые ссылаются не на то, что int - это требуемый тип возврата в C89 и C99, если вы хотите программы должны быть переносимыми. –
Если вы идете по спецификации, вы всегда должны объявлять main как int.
На самом деле, большинство компиляторов позволят вам уйти с любой из них, поэтому реальная разница заключается в том, хотите ли вы/нужно вернуть значение в оболочку.
Вы всегда должны стараться делать вещи «по спецификации», если нет веской причины не делать этого. Разумеется, многие реализации позволяют использовать void main и другие расширения. Это не означает, что вы должны полагаться на конкретные расширения реализации. Во встроенных приложениях, без оболочки, void main в порядке. – Trent
Я собираюсь пойти и согласиться со всем этим. Некоторое время я привык использовать void vs int как своего рода pesudo-comment о том, ожидал ли я вернуть значение, но теперь я всегда использую int. –
Почему стоит делать неправильную вещь (что в некоторых случаях случается с работой), когда правильная вещь больше работает? – Tom
Дело в том, что программы C (и C++ одинаковы) всегда (должны?) Возвращают значение успеха или код ошибки, поэтому их следует объявить таким образом.
Давным-давно я нашел this page (void main(void)), который содержал множество причин за пределами аргумента «стандарт говорит, что это неверно». В определенных операционных системах/архитектурах это может привести к повреждению стека и другим неприятным вещам.
В C++ main()
должен вернуть int
. Однако C99 позволяет main()
иметь тип возврата не int
. Вот отрывок из стандарта C99.
5.1.2.2.1 запуска программы
Функция называется при запуске программы называется основной. Реализация объявляет прототип для этой функции.Она должна быть определена с типом возвращаемого междунар и без каких-либо параметров:
int main(void) { /* ... */ }
или с двумя параметрами (именуемых здесь как ARGC и ARGV, хотя любые имена могут быть использованы, так как они являются локальными по отношению к функции, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; или каким-либо другим способом реализации.
Также обратите внимание, что gcc компилирует void main()
, хотя практически, он имеет return 0;
при столкновении с закрывающей скобой.
'gcc -pedantic', однако, отклонит его. И не использование '-pedantic' просто испортилось. –
Согласен, но я использовал gcc только в качестве примера, потому что это, пожалуй, самый популярный компилятор. Стандарт явно допускает тип возврата non-int для main() в C99, в соответствии с текстом, выделенным жирным шрифтом. –
Если вы полагаетесь на поведение, определяемое реализацией, то ваша программа не соответствует стандартам. Ваш компилятор может принять его, но он недействителен C99, просто foo-C99. – Jed
Бьярне Stroustrups сделал это совершенно ясно:
«Определение void main()
не является и никогда не был C++, не имеет даже был С.»
- 1. Разница между «void main» и «int main»
- 2. Как работает int main() и void main()
- 3. C int main() vs. int main (void)
- 4. Чем отличается int main() и int main (void)?
- 5. int main (void), давая ошибку
- 6. Разница между static void main (string [] args) и static void main() в C#?
- 7. Разница между public static void main (String [] args) и public static void main (String args [])?
- 8. Разница между основным (void) и main() в C
- 9. Почему c разрешает main(), даже если это не int main() или void main()?
- 10. Вложение int main() внутри int main()
- 11. Имеет ли функция int main (void) 0?
- 12. разница между void (int) & void (*) (int)
- 13. main() vs int main() в DevC++
- 14. Добавление Void main() wpf
- 15. В чем разница между public static void Main() и private static void Main() в приложении консоли C#?
- 16. C main vs Java main
- 17. В чем разница между wmain и main?
- 18. разница между b main и b * main/find main обратный адрес в C
- 19. Int main и другие функции
- 20. Использование int Вместо String: public static void main (int [] args)
- 21. int var = 1; void main() {int i = i; }
- 22. В чем разница между void (int) и void (*) (int)?
- 23. Почему main() в java void?
- 24. Доступ к main() в public static void main (String arg [])
- 25. Void недействителен для переменной main?
- 26. В чем разница между void() и void {}?
- 27. разница между (void *) и &
- 28. Почему int main() {} компилируется?
- 29. Несколько int main() 's?
- 30. Какао: int main function
INT основной (аннулируются) также собственно – Trent
На самом деле, в то время как это хорошо, я думаю, что ИНТ основной() является предпочтительным Int основной (вакуум) – Alan
Они * минимум * требование в отношении аргументов (и это «char * argv []», а не «char ** argv»). Реализации явно разрешено предоставлять больше форм. Однако тип возврата int не подлежит обсуждению. – paxdiablo