Возможный дубликат:
Какова правильная декларация основного?
Я работаю над своими навыками C, и я заметил, что
int main (int argc, char * argv [])
и
return (EXIT_SUCCESS)
вместо
int main() и return 0
Почему это?
Возможный дубликат:
Какова правильная декларация основного?
Я работаю над своими навыками C, и я заметил, что
int main (int argc, char * argv [])
и
return (EXIT_SUCCESS)
вместо
int main() и return 0
Почему это?
Если вы проигнорируете список аргументов, разумно и разумно использовать:
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 Запуск программы
¶1 Функция, вызванная при запуске программы, называется
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 Окончание программы
¶1 Если возвращаемый тип функции
main
является типом, совместимым сint
, возврат из начальный вызов функцииmain
эквивалентен вызову функцииexit
со значением возвращаемый функциейmain
в качестве аргумента; 10) достигающий}
, который завершает Функцияmain
возвращает значение 0. Если тип возврата не совместим сint
, статус завершения, возвращенный в среду хоста, не указан.10) В соответствии с §6.2.4, времена жизни объектов с автоматическим временем хранения, объявленные в
main
закончится в первом случае, даже если они не были бы в последнем.§7.20.4.3 Функция выхода
¶5 Наконец, управление возвращается в среду хоста. Если значение статуса равно нулю или EXIT_SUCCESS, форма реализации успешного успешного завершения вернулся. Если значением статуса является EXIT_FAILURE, форма, определяемая реализацией статуса неудачного завершения возвращается. В противном случае возвращается статус от реализации.
Кроме того: обратите внимание, что в §5.1.2.2.3 четко указано, что стандарт C позволяет реализации допускать типы возврата для main()
, отличных от int
(в отличие от стандарта С++, который явно запрещает тип возврата, отличный от int
). Однако, как справедливо указывает Jens, возвращаемый тип не int
из main
разрешен только в том случае, если реализация явно документирует, что это разрешено, и документация, вероятно, установит ограничения на то, что разрешено.
int main (int argc, char * argv [])
предназначен для тех случаев, когда вы хотите использовать аргументы командной строки.
EXIT_SUCCESS
является просто a #define
, более наглядным, чем 0
.
int main( int argc, char *argv[] )
позволяет пользователю вводить аргументы при выполнении программы, т.е. текст, который вы записываете в консоли после имени программы.
return (EXIT_SUCCESS)
в случае O.S. не ожидает 0 как значения успешного выхода: это будет любое другое значение, но в большинстве случаев EXIT_SUCCESS равно 0.
Операционные системы могут отличаться тем, как программа указывает на успешную работу. Макрос EXIT_SUCCESS
идеально расширяется до значения, соответствующего системе, с которой скомпилирована программа.
(Две вещи, которые вы просите, не имеют ничего общего друг с другом.)
Чтобы ответить на свой первый вопрос: Наличие int main() означает, что программа не принимает аргументы командной строки. Когда он принимает два аргумента, argc - это счетчик аргументов (он всегда будет больше или равен единице, так как первым аргументом будет путь или имя самой программы), а argv - список аргументов.
Чтобы ответить на второй вопрос: EXIT_SUCCESS гарантированно будет интерпретироваться как базовая операционная система.