Разница между void main и int main в C / с ++?

Имеет ли значение, каким образом я объявляю функцию main в программе на C ++ (или C)?


person Kredns    schedule 11.03.2009    source источник


Ответы (8)


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

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

int main(int argc, char** argv)

or

int main()

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

void main(int argc, char** argv)

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

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

person Alan    schedule 11.03.2009
comment
int main (void) тоже правильно - person Trent; 12.03.2009
comment
На самом деле, хотя это нормально, я думаю, что int main () предпочтительнее int main (void) - person Alan; 12.03.2009

Бьярн Страуструп совершенно ясно дал понять:

Определение void main() не является и никогда не было ни C ++, ни даже C.

См. ссылку.

person vobject    schedule 17.01.2010

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

person RedBlueThing    schedule 11.03.2009

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

Короче всегда int.

person Joe    schedule 11.03.2009
comment
Для C89 также требуется возврат типа int. - person Dana the Sane; 12.03.2009

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

person Svante    schedule 12.03.2009
comment
Да? И кто будет использовать этот код возврата в голом металлическом устройстве марсохода? :) - person BitTickler; 19.01.2020
comment
Это полезный вопрос - как дзен-коан. - person Svante; 19.01.2020

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

person X-Istence    schedule 12.03.2009

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

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

person Electrons_Ahoy    schedule 12.03.2009
comment
Вы всегда должны пытаться делать что-то в соответствии со спецификацией, если нет веской причины не делать этого. Конечно, многие реализации позволяют использовать void main и другие расширения. Это не означает, что вам следует полагаться на расширения для конкретной реализации. Во встроенных приложениях без оболочки можно использовать void main. - person Trent; 12.03.2009
comment
Я собираюсь пойти дальше и согласиться со всем этим. Некоторое время я привык использовать void vs int как своего рода псевдо-комментарий о том, ожидал ли я вернуть значение, но теперь я просто всегда использую int. - person Electrons_Ahoy; 12.03.2009
comment
Почему имеет смысл поступать неправильно (что в некоторых случаях работает), когда правильное - это больше работы? - person Tom; 12.03.2009
comment
@Tom: потому что ... правильно было больше работы? Я не уверен, что это предложение правильно разбирается. - person Electrons_Ahoy; 12.03.2009
comment
@Ahoy - я пропустил одно ключевое слово там ... хотел сказать ... когда правильнее будет нет работы - person Tom; 12.03.2009
comment
@Tom - попался. И, честно говоря, я с вами согласен. - person Electrons_Ahoy; 12.03.2009
comment
+1 за краткость. Я не знаю, как я сюда попал, мне не нужно было знать, но я обнаружил, что читаю другие ответы. Это действительно займет одно или два предложения. - person dyasta; 14.03.2017
comment
@Trent Спецификация - это движущаяся цель. Когда я впервые использовал C ++ (это было примерно в 1992 году), void main (void) был нормой. И это имеет смысл, учитывая, что есть также встроенное программное обеспечение на чистом железе, где конец основного - это конец интеллектуального устройства;) - person BitTickler; 19.01.2020

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

person Masked Man    schedule 17.01.2010
comment
gcc -pedantic, однако, отклонит его. А не использовать -pedantic - это просто лажа. - person Konrad Rudolph; 17.01.2010
comment
Если вы полагаетесь на поведение, определяемое реализацией, ваша программа не соответствует стандартам. Ваш компилятор может принять это, но это недействительный C99, просто foo-C99. - person Jed; 27.08.2010
comment
@Konrad Rudolph Эй, если мы не используем gcc -pedantic, значит ли это, что мы не используем стандартный C? Во-вторых, я был бы признателен, если вы мне скажете, где это написано. - person Niraj Raut; 22.01.2021
comment
@Jed Эй, если мы не используем gcc -pedantic, значит ли это, что мы не используем стандартный C? Во-вторых, я был бы признателен, если вы мне скажете, где это написано. - person Niraj Raut; 22.01.2021
comment
@NirajRaut Нет, наоборот. Я всегда использую по крайней мере -pedantic или -pedantic-errors. Нет абсолютно никаких причин для использования неправильного типа возврата, это просто небрежно (но обратите внимание, что у автономных реализаций C есть другие функции точки входа!). - person Konrad Rudolph; 22.01.2021