Стили основных функций в C

Возможный дубликат:
Какова правильная декларация основного?

Я работаю над своими навыками C, и я заметил, что

int main (int argc, char * argv [])

и

return (EXIT_SUCCESS)

вместо

int main() и return 0

Почему это?

Ответ 1

Если вы проигнорируете список аргументов, разумно и разумно использовать:

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 разрешен только в том случае, если реализация явно документирует, что это разрешено, и документация, вероятно, установит ограничения на то, что разрешено.

Ответ 2

int main (int argc, char * argv []) предназначен для тех случаев, когда вы хотите использовать аргументы командной строки.

EXIT_SUCCESS является просто a #define, более наглядным, чем 0.

Ответ 3

int main( int argc, char *argv[] ) позволяет пользователю вводить аргументы при выполнении программы, т.е. текст, который вы записываете в консоли после имени программы.

return (EXIT_SUCCESS) в случае O.S. не ожидает 0 как значения успешного выхода: это будет любое другое значение, но в большинстве случаев EXIT_SUCCESS равно 0.

Ответ 4

Операционные системы могут отличаться тем, как программа указывает на успешную работу. Макрос EXIT_SUCCESS идеально расширяется до значения, соответствующего системе, с которой скомпилирована программа.

http://en.wikipedia.org/wiki/Exit_status

Ответ 5

(Две вещи, которые вы просите, не имеют ничего общего друг с другом.)

Чтобы ответить на свой первый вопрос: Наличие int main() означает, что программа не принимает аргументы командной строки. Когда он принимает два аргумента, argc - это счетчик аргументов (он всегда будет больше или равен единице, так как первым аргументом будет путь или имя самой программы), а argv - список аргументов.

Чтобы ответить на второй вопрос: EXIT_SUCCESS гарантированно будет интерпретироваться как базовая операционная система.