Разница между void main и int main?
Имеет ли значение, каким образом я объявляю свои программы на C++?
8 ответов
Разница в том, что это правильный способ определения main
а другой нет.
И да, это имеет значение. Или
int main(int argc, char** argv)
или же
int main()
правильное определение вашего main
согласно спецификации C++.
void main(int argc, char** argv)
IIRC не был и не был извращением, которое было в старых компиляторах C++ от Microsoft.
Бьярне Страуструп сделал это совершенно ясно:
Определение
void main()
не является и никогда не был C++, и даже не был C.
Смотрите ссылку.
Вы должны использовать int main
, В стандартах C и C++ указано, что main
должен вернуть значение.
Для C++ допускается только int. Для C C99 говорит, что разрешено только int. Предыдущий стандарт допускается для void
вернуть.
Короче всегда int
,
Дело в том, что программы на C (и C++ одинаковые) всегда (должны?) Возвращают значение успеха или код ошибки, поэтому они должны быть объявлены таким образом.
Давным-давно я нашел эту страницу (void main(void)), в которой содержалось много причин, выходящих за рамки аргумента "стандарт гласит, что он недействителен". В определенных операционных системах / архитектурах это может привести к повреждению стека и другим неприятным последствиям.
Если вы идете по спецификации, то вы должны всегда объявлять main
возвращая int
,
В действительности, однако, большинство компиляторов позволят вам избежать использования любого из них, поэтому реальная разница в том, если вы хотите / должны возвращать значение в оболочку.
В C++ main()
должен вернуться int
, Тем не менее, C99 позволяет main()
иметь не int
тип возврата. Вот выдержка из стандарта C99.
5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется основной. Реализация не объявляет прототип для этой функции. Он должен быть определен с типом возврата int и без параметров:
int main(void) { /* ... */ }
или с двумя параметрами (именуемыми здесь как argc и argv, хотя могут использоваться любые имена, так как они являются локальными для функции, в которой они объявлены):
int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; или каким-либо другим способом, определяемым реализацией.
Также обратите внимание, что GCC компилирует void main()
хотя практически, это делает return 0;
при встрече с закрывающей скобкой.