2009-03-11 2 views

ответ

59

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

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

int main(int argc, char** argv) 

или

int main() 

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

void main(int argc, char** argv)

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

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

+2

INT основной (аннулируются) также собственно – Trent

+9

На самом деле, в то время как это хорошо, я думаю, что ИНТ основной() является предпочтительным Int основной (вакуум) – Alan

+2

Они * минимум * требование в отношении аргументов (и это «char * argv []», а не «char ** argv»). Реализации явно разрешено предоставлять больше форм. Однако тип возврата int не подлежит обсуждению. – paxdiablo

8

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

Короче говоря, всегда инт.

+3

Возвращение int также требуется для C89. –

+0

На самом деле, C89 является неопределенным в зависимости от того, как вы его читаете. Интересное чтение здесь: http://homepages.tesco.net/J.deBoynePollard/FGA/legality-of-void-main.html – Joe

+0

, которые ссылаются не на то, что int - это требуемый тип возврата в C89 и C99, если вы хотите программы должны быть переносимыми. –

11

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

+0

Он должен возвращать 0 как в обратном 0; – Kensai

+0

Я хочу спросить, кому он возвращает значение? – Vinay

+0

@Vinay: Для выполнения любой вашей программы (как правило, ОС). – Alan

2

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

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

+0

Вы всегда должны стараться делать вещи «по спецификации», если нет веской причины не делать этого. Разумеется, многие реализации позволяют использовать void main и другие расширения. Это не означает, что вы должны полагаться на конкретные расширения реализации. Во встроенных приложениях, без оболочки, void main в порядке. – Trent

+0

Я собираюсь пойти и согласиться со всем этим. Некоторое время я привык использовать void vs int как своего рода pesudo-comment о том, ожидал ли я вернуть значение, но теперь я всегда использую int. –

+0

Почему стоит делать неправильную вещь (что в некоторых случаях случается с работой), когда правильная вещь больше работает? – Tom

4

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

2

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

3

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

+6

'gcc -pedantic', однако, отклонит его. И не использование '-pedantic' просто испортилось. –

+0

Согласен, но я использовал gcc только в качестве примера, потому что это, пожалуй, самый популярный компилятор. Стандарт явно допускает тип возврата non-int для main() в C99, в соответствии с текстом, выделенным жирным шрифтом. –

+0

Если вы полагаетесь на поведение, определяемое реализацией, то ваша программа не соответствует стандартам. Ваш компилятор может принять его, но он недействителен C99, просто foo-C99. – Jed

Смежные вопросы