Стили основных функций в Си
Возможный дубликат:
Что такое правильное объявление основного?
Я работаю над своими навыками C, и я заметил, что
int main( int argc, char *argv[])
а также
возврат (EXIT_SUCCESS)
вместо
int main() и вернуть 0
Почему это?
5 ответов
Если вы собираетесь игнорировать список аргументов, разумно и целесообразно использовать:
int main(void) { ... }
Стандарты благословляют это использование так же как тот с аргументами. Вы получаете предупреждение от GCC, если вы компилируете с -Wstrict-prototypes
и не включать void
поэтому я пишу void
, С ++ здесь другой.
Что касается return EXIT_SUCCESS;
в целом, кажется, что это мало что дает; Я продолжаю писать return 0;
в конце main()
функция, даже если C99 позволяет вам пропустить любой возврат там (и тогда он ведет себя так, как будто вы написали return 0;
).
ISO / IEC 9899: 1999
§5.1.2.2.1 Запуск программы
Called1 Функция, вызываемая при запуске программы, называется
main
, Реализация не объявляет прототип для этой функции. Он должен быть определен с типом возвратаint
и без параметров:int main(void) { /* ... */ }
или с двумя параметрами (упоминается здесь как
argc
а такжеargv
хотя могут использоваться любые имена, так как они являются локальными для функции, в которой они объявлены):int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; 9) или каким-либо другим способом, определяемым реализацией.
9) Таким образом,
int
может быть заменено именем typedef, определенным какint
или типargv
можно записать какchar ** argv
, и так далее.§5.1.2.2.3 Прекращение программы
If1 Если тип возвращаемого значения
main
функция совместима с типомint
, возврат от первоначального вызова кmain
Функция эквивалентна вызовуexit
функция со значением, возвращаемымmain
функция в качестве аргумента; 10) достижение}
что завершаетmain
функция возвращает значение 0. Если тип возвращаемого значения не совместим сint
статус завершения, возвращаемый в хост-среду, не указан.10) В соответствии с §6.2.4 время жизни объектов с автоматическим сроком хранения, объявленным в
main
закончится в первом случае, даже если они не будут иметь во втором.§7.20.4.3 Функция выхода
Finally5 Наконец, управление возвращается в среду хоста. Если значение статуса равно нулю или EXIT_SUCCESS, возвращается определяемая реализацией форма успешного завершения статуса. Если значением состояния является EXIT_FAILURE, возвращается определяемая реализацией форма неудачного завершения статуса. В противном случае возвращаемый статус определяется реализацией.
Отметим, что §5.1.2.2.3 ясно указывает, что стандарт C позволяет реализации разрешать типы возврата для main()
Кроме как int
(в отличие от стандарта C++, который явно запрещает тип возвращаемого значения, кроме int
). Однако, как справедливо отмечает Jens Gustedt, int
тип возврата из main
допускается только в том случае, если реализация явно документирует, что это разрешено, и документация, вероятно, будет устанавливать ограничения на то, что разрешено.
(Две вещи, которые вы просите, не имеют ничего общего друг с другом.)
Чтобы ответить на ваш первый вопрос: наличие int main() просто означает, что программа не принимает аргументы командной строки. Когда он принимает два аргумента, argc - это число аргументов (оно всегда будет больше или равно единице, поскольку первым аргументом будет путь или имя самой программы), а argv - это список аргументов.
Чтобы ответить на ваш второй вопрос: базовая операционная система гарантированно интерпретирует EXIT_SUCCESS как успех.
int main (int argc, char * argv [])
для того, когда вы хотите принять аргументы командной строки.
EXIT_SUCCESS
это просто #define
это более наглядно, чем 0
,
Операционные системы могут отличаться в том, как программа указывает на успешную работу. Макрос EXIT_SUCCESS
в идеале расширяется до значения, соответствующего системе, для которой составляется программа.
int main( int argc, char *argv[] )
позволяет пользователю вводить аргументы при выполнении программы, т. е. текст, который вы пишете в консоли после имени программы.
return (EXIT_SUCCESS)
в случае, если ОС не ожидает 0 в качестве значения успешного завершения: это будет любое другое значение, но в большинстве случаев EXIT_SUCCESS равно 0.