Что должно возвращать main () в C и C ++? - PullRequest
632 голосов

Ответы [ 18 ]

522 голосов
/ 15 октября 2008

Возвращаемое значение для main должно указывать на выход программы. Нормальный выход обычно представлен значением возврата 0 из main. Ненормальный выход обычно сигнализируется ненулевым возвратом, но не существует стандарта для интерпретации ненулевых кодов. Также, как отмечалось другими, void main() явно запрещено стандартом C ++ и не должно использоваться. Допустимые подписи C ++ main:

int main()

и

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

, что эквивалентно

int main(int argc, char** argv)

Стоит также отметить, что в C ++ int main() можно оставить без оператора return, после чего по умолчанию возвращается 0. Это также верно для программы C99. Вопрос о том, должен ли return 0; быть опущен или нет, открыт для обсуждения. Диапазон действительных основных сигнатур программы на Си намного больше.

Кроме того, эффективность не является проблемой с функцией main. Он может быть введен и оставлен только один раз (отмечен запуск и завершение программы) в соответствии со стандартом C ++. Для C дело обстоит иначе, и повторный ввод main() разрешен, но его следует избегать.

155 голосов
/ 16 октября 2008

Кажется, что принятый ответ предназначен для C ++, поэтому я решил добавить ответ, относящийся к C, и он отличается в нескольких отношениях.

ИСО / МЭК 9899: 1989 (С90):

main() должно быть объявлено как:

int main(void)
int main(int argc, char **argv)

Или эквивалент. Например, int main(int argc, char *argv[]) эквивалентно второму. Кроме того, тип возврата int может быть опущен, так как это значение по умолчанию.

Если реализация разрешает это, main() может быть объявлено другими способами, но это делает реализацию программы определенной, и более не строго соответствующей.

Стандарт определяет 3 значения для возврата, которые строго соответствуют (то есть не зависят от поведения, определенного реализацией): 0 и EXIT_SUCCESS для успешного завершения и EXIT_FAILURE для неудачного завершения. Любые другие значения являются нестандартными и определяются реализацией. main() должен иметь явное выражение return в конце, чтобы избежать неопределенного поведения.

Наконец, с точки зрения стандартов, нет ничего плохого в вызове main() из программы.

ИСО / МЭК 9899: 1999 (С99):

Для C99 все то же самое, что и выше, за исключением:

  • Тип возвращаемого значения int не может быть пропущен.
  • Вы можете опустить оператор возврата из main(). Если вы это сделаете и main() закончили, то есть неявное return 0.
110 голосов
/ 10 сентября 2013

Стандарт C - размещенная среда

Для размещенной среды (это нормальная среда) стандарт C11 (ISO / IEC 9899: 2011) гласит:

5.1.2.2.1 Запуск программы

Функция, вызываемая при запуске программы, называется main. Реализация заявляет нет прототип для этой функции. Он должен быть определен с типом возврата int и без Параметры:

int main(void) { /* ... */ }

или с двумя параметрами (именуемыми здесь argc и argv, хотя любые имена могут быть используется, поскольку они являются локальными для функции, в которой они объявлены):

int main(int argc, char *argv[]) { /* ... */ }

или эквивалентный; 10) или другим способом, определяемым реализацией.

Если они объявлены, параметры главной функции должны соответствовать следующим Ограничения:

  • Значение argc должно быть неотрицательным.
  • argv[argc] должен быть нулевым указателем.
  • Если значение argc больше нуля, элементы массива argv[0] через argv[argc-1] включительно должен содержать указатели на строки, которые даны значения, определенные реализацией средой хоста до запуска программы. намерение состоит в том, чтобы предоставить программе информацию, определенную до ее запуска из другого места в размещенной среде. Если среда хоста не способна предоставление строк с буквами в верхнем и нижнем регистре, реализация убедитесь, что строки получены в нижнем регистре.
  • Если значение argc больше нуля, строка, на которую указывает argv[0] представляет название программы; argv[0][0] должен быть нулевым символом, если Имя программы недоступно в хост-среде. Если значение argc больше единицы строки, указанные на argv[1] - argv[argc-1] представляют параметры программы.
  • Параметры argc и argv и строки, на которые указывает массив argv, должны быть изменяемыми программой и сохранять их последние сохраненные значения между программами запуск и завершение программы.

10) Таким образом, int может быть заменено именем typedef, определенным как int, или тип argv может быть записан как char **argv и т. Д.

Завершение программы в C99 или C11

Значение, возвращаемое из main(), передается в «среду» способом, определяемым реализацией.

5.1.2.2.3 Завершение программы

1 Если тип возврата функции main является типом, совместимым с int, возврат из первоначальный вызов функции main эквивалентен вызову функции exit со значением возвращается функцией main в качестве аргумента; 11) , достигая }, который завершает Функция main возвращает значение 0. Если тип возвращаемого значения не совместим с int, статус завершения, возвращенный в среду хоста, не указан.

11) В соответствии с 6.2.4, время жизни объектов с автоматической продолжительностью хранения объявлено в main закончится в первом случае, даже если они не закончатся во втором.

Обратите внимание, что 0 обозначается как «успех». Вы можете использовать EXIT_FAILURE и EXIT_SUCCESS из <stdlib.h>, если хотите, но 0 точно установлено, как и 1. См. Также Коды выхода больше 255 - возможно? .

В C89 (и, следовательно, в Microsoft C) нет заявления о том, что произойдет, если функция main() вернется, но не определит возвращаемое значение; следовательно, это ведет к неопределенному поведению.

7.22.4.4 exit функция

Finally5 Наконец, управление возвращается в среду хоста. Если значение status равно нулю или EXIT_SUCCESS, возвращается определяемая реализацией форма состояния успешного завершения . Если значение status равно EXIT_FAILURE, возвращается определяемая реализацией форма состояния неудачное завершение . В противном случае возвращаемый статус определяется реализацией.

Стандарт C ++ - размещенная среда

Стандарт C ++ 11 (ISO / IEC 14882: 2011) гласит:

3.6.1 Основная функция [basic.start.main]

¶1 Программа должна содержать глобальную функцию main, которая является назначенным началом программы. [...]

¶2 Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Это должно иметь тип возвращаемого значения типа int, но в противном случае его тип определяется реализацией. Все реализации должно допускать оба следующих определения основных:

int main() { /* ... */ }

и

int main(int argc, char* argv[]) { /* ... */ }

В последнем виде argc - количество аргументов, переданных программе из среды в котором программа запускается. Если argc отлично от нуля, эти аргументы должны быть указаны в argv[0] через argv[argc-1] в качестве указателей на начальные символы многобайтовых строк с нулевым символом в конце (NTMBS) (17.5.2.1.4.2) и argv[0] должны быть указателем на начальный символ NTMBS, который представляет имя, используемое для вызова программы или "". Значение argc должно быть неотрицательным. Значение argv[argc] должно быть 0. [Примечание: Рекомендуется добавлять любые дополнительные (необязательные) параметры после argv. -конец примечание]

¶3 Функция main не должна использоваться в программе. Связь (3.5) main определяется реализацией. [...]

¶5 Оператор возврата в main приводит к выходу из функции main (уничтожение любых объектов автоматически длительность хранения) и вызов std::exit с возвращаемым значением в качестве аргумента. Если контроль достигает конца main, не встречая оператора return, эффект от выполнения

return 0;

Стандарт C ++ явно говорит: «Он [основная функция] должен иметь тип возврата типа int, но в противном случае его тип определяется реализацией», и для поддержки в качестве опций требуются те же две сигнатуры, что и для стандарта C , Так что void main () напрямую не разрешен стандартом C ++, хотя он ничего не может сделать, чтобы остановить нестандартную реализацию, допускающую альтернативы. Обратите внимание, что C ++ запрещает пользователю звонить main (но стандарт C этого не делает).

Есть параграф §18.5 Начало и окончание в стандарте C ++ 11, который идентичен абзацу из §7.22.4.4 Функция exit в C11 стандарт (цитируется выше), за исключением сноски (которая просто документирует, что EXIT_SUCCESS и EXIT_FAILURE определены в <cstdlib>).

Стандарт C - Общее расширение

Классически системы Unix поддерживают третий вариант:

int main(int argc, char **argv, char **envp) { ... }

Третий аргумент - это список указателей на строки с нулевым символом в конце, каждый из которых является переменной окружения, которая имеет имя, знак равенства и значение (возможно, пустое). Если вы не используете это, вы все равно можете попасть в окружение через 'extern char **environ;'. Долгое время у этого не было заголовка, который объявил его, но стандарт POSIX 2008 теперь требует, чтобы он был объявлен в <unistd.h>.

Это признано стандартом C как общее расширение, документированное в Приложении J:

J.5.1 Аргументы среды

¶1 В размещенной среде главная функция получает третий аргумент, char *envp[], указывает на массив указателей с нулевым символом в конце char, каждый из которых указывает на строку который предоставляет информацию о среде для выполнения программы (5.1.2.2.1).

Microsoft C

Microsoft VS 2010 - интересный компилятор. На сайте написано:

Синтаксис объявления для main:

 int main();

или, необязательно,

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

Кроме того, функции main и wmain могут быть объявлены как возвращающие void (без возвращаемого значения). Если вы объявляете main или wmain как возвращающее void, вы не можете вернуть код завершения родительскому процессу или операционной системе с помощью оператора return. Чтобы вернуть код выхода, когда main или wmain объявлен как void, необходимо использовать функцию exit.

Мне не ясно, что происходит (какой код выхода возвращается родительскому или ОС), когда программа с void main() завершает работу - и веб-сайт MS тоже молчит.

Интересно, что MS не предписывает версию main() с двумя аргументами, которая требуется для стандартов C и C ++. Он только предписывает форму с тремя аргументами, где третий аргумент - char **envp, указатель на список переменных среды.

На странице Microsoft также перечислены некоторые другие альтернативы - wmain(), которая принимает строки широких символов, и некоторые другие.

Microsoft Visual Studio 2005 версия на этой странице не перечисляет void main() в качестве альтернативы. версии от Microsoft Visual Studio 2008 и далее.

Стандарт C - Отдельно стоящая среда

Как уже отмечалось ранее, вышеприведенные требования применяются к размещенным средам. Если вы работаете с автономной средой (которая является альтернативой размещенной среде), то о стандарте можно сказать гораздо меньше. Для автономной среды функцию, вызываемую при запуске программы, не нужно называть main, и нет никаких ограничений на ее тип возвращаемого значения. Стандарт гласит:

5.1.2 Среда исполнения

Определены две среды исполнения: автономная и размещенная. В обоих случаях, запуск программы происходит, когда назначенная функция C вызывается при выполнении среда. Все объекты со статической продолжительностью хранения должны быть инициализированы (установлены их начальные значения) перед запуском программы. Способ и время такой инициализации в остальном не определены. Завершение программы возвращает управление среде выполнения.

5.1.2.1 Отдельно стоящая среда

В автономной среде (в которой выполнение программы на С может происходить без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются реализацией. Любые библиотечные средства, доступные для автономной программы, кроме минимального набора, требуемого пунктом 4, определяются реализацией.

Эффект завершения программы в автономной среде определяется реализацией.

Перекрестная ссылка на пункт 4 Соответствие относится к этому:

¶5 A строго соответствующая программа должна использовать только те функции языка и библиотеки, которые указаны в настоящем международном стандарте. 3) Она не должна производить вывод, зависящий от каких-либо неопределенных, неопределенных или поведение, определяемое реализацией, и не должно превышать какого-либо минимального предела реализации.

¶6 Двумя формами соответствующей реализации являются hosted и freestanding . соответствующая размещенная реализация принимает любую строго соответствующую программу. соответствующая автономная реализация должна принимать любую строго соответствующую программу, в которой использование функций, указанных в разделе библиотеки (пункт 7), ограничено содержимым стандартных заголовков <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h> и <stdnoreturn.h>. Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции), при условии, что они не изменяют поведение любой строго соответствующей программы. 4)

*7 Соответствующая программа является приемлемой для соответствующей реализации. 5)

3) Строго соответствующая программа может использовать условные функции (см. 6.10.8.3) при условии, что использование защищено соответствующей директивой предварительной обработки условного включения с использованием соответствующего макроса. Например:

#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */
    /* ... */
    fesetround(FE_UPWARD);
    /* ... */
#endif

4) Это означает, что соответствующая реализация не оставляет никаких идентификаторов, кроме тех, которые явно зарезервированы в этом международном стандарте.

5) Строго соответствующие программы предназначены для максимальной переносимости среди соответствующих реализаций. Соответствующие программы могут зависеть от непереносимых функций соответствующей реализации.

Примечательно, что для автономной среды, которая фактически определяет какие-либо функции, требуется только заголовок <stdarg.h> (и даже это могут быть - и часто это - просто макросы).

Стандарт C ++ - Отдельная среда

Так же, как стандарт C признает как размещенную, так и автономную среду, то же самое относится и к стандарту C ++. (Цитаты из ИСО / МЭК 14882: 2011.)

1.4 Соответствие реализации [intro.compliance]

¶7 Определены два вида реализаций: размещенная реализация и автономная реализация . Для размещенной реализации этот международный стандарт определяет набор доступных библиотек. Отдельно стоящий Реализация - это та, в которой выполнение может происходить без использования операционной системы, и имеет определенный для реализации набор библиотек, который включает в себя определенные библиотеки поддержки языка (17.6.1.3).

¶8 Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции), при условии, что они не изменяют поведение любой правильно сформированной программы. Реализации необходимы для диагностики программ, которые использовать такие расширения, которые не соответствуют требованиям настоящего международного стандарта. Сделав это, однако, они могут компилировать и выполнять такие программы.

¶9 Каждая реализация должна включать документацию, которая идентифицирует все условно поддерживаемые конструкции, которые она не поддерживает, и определяет все специфичные для локали характеристики. 3

3) Эта документация также определяет поведение, определяемое реализацией; см. 1.9.

17.6.1.3 Отдельно стоящие реализации [соответствие]

Определены два вида реализаций: размещенный и автономный (1.4). Для размещенной реализации этот международный стандарт описывает набор доступных заголовков.

Автономная реализация имеет набор заголовков, определяемый реализацией. Этот набор должен включать как минимум заголовки, показанные в таблице 16.

В поставляемой версии заголовка <cstdlib> должны быть объявлены как минимум функции abort, atexit, at_quick_exit, exit и quick_exit (18.5). Другие заголовки, перечисленные в этой таблице, должны соответствовать тем же требованиям, что и для размещенной реализации.

Таблица 16 - Заголовки C ++ для автономных реализаций

Subclause                           Header(s)
                                    <ciso646>
18.2  Types                         <cstddef>
18.3  Implementation properties     <cfloat> <limits> <climits>
18.4  Integer types                 <cstdint>
18.5  Start and termination         <cstdlib>
18.6  Dynamic memory management     <new>
18.7  Type identification           <typeinfo>
18.8  Exception handling            <exception>
18.9  Initializer lists             <initializer_list>
18.10 Other runtime support         <cstdalign> <cstdarg> <cstdbool>
20.9  Type traits                   <type_traits>
29    Atomics                       <atomic>

Как насчет использования int main() в C?

Стандарт §5.1.2.2.1 стандарта C11 показывает предпочтительное обозначение - int main(void) - но в стандарте также есть два примера, которые показывают int main(): §6.5.3.4 ¶8 и §6.7.6.320 . Теперь важно отметить, что примеры не являются «нормативными»; они только иллюстративны. Если в примерах есть ошибки, они не влияют напрямую на основной текст стандарта. Тем не менее, они строго свидетельствуют об ожидаемом поведении, поэтому, если стандарт включает в себя int main() в качестве примера, он предполагает, что int main() не запрещен, даже если он не является предпочтительным обозначением.

6.5.3.4 Операторы sizeof и _Alignof

...

№8 ПРИМЕР 3 ВВ этом примере размер массива переменной длины вычисляется и возвращается из функции:

#include <stddef.h>

size_t fsize3(int n)
{
    char b[n+3]; // variable length array
    return sizeof b; // execution time sizeof
}
int main()
{
    size_t size;
    size = fsize3(10); // fsize3 returns 13
    return 0;
}
58 голосов
/ 15 октября 2008

Я считаю, что main() должен вернуть либо EXIT_SUCCESS, либо EXIT_FAILURE. Они определены в stdlib.h

37 голосов
/ 07 июля 2015

Обратите внимание, что стандарты C и C ++ определяют два вида реализаций: автономные и размещенные.

  • C90 размещенная среда

    Разрешенные формы 1 :

    int main (void)
    int main (int argc, char *argv[])
    
    main (void)
    main (int argc, char *argv[])
    /*... etc, similar forms with implicit int */
    

    Комментарии:

    Первые два явно указаны как разрешенные формы, остальные неявно разрешены, потому что C90 разрешил "неявное int" для возвращаемого типа и параметров функции. Никакая другая форма не допускается.

  • C90 автономная среда

    Разрешается любая форма или имя основного лица 2 .

  • C99 размещенная среда

    Разрешенные формы 3 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    

    Комментарии:

    C99 удалил "implicit int", поэтому main() больше не действителен.

    Введено странное, неоднозначное предложение "или каким-либо другим образом, определяемым реализацией". Это может быть либо интерпретировано как «параметры для int main() могут различаться», либо как «main может иметь любую форму, определяемую реализацией».

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

    Однако разрешить совершенно дикие формы main(), вероятно, (?) Не было целью этого нового предложения. Обоснование C99 (не нормативное) подразумевает, что предложение относится к дополнительным параметрам к int main 4 .

    Тем не менее, раздел о завершении программы в размещенной среде продолжает спорить о случае, когда main не возвращает int 5 . Хотя этот раздел не является нормативным для того, как main должен быть объявлен, он определенно подразумевает, что main может быть объявлен полностью определяемым реализацией способом даже в размещенных системах.

  • C99 автономная среда

    Разрешается любая форма или имя главного 6 .

  • C11 размещенная среда

    Разрешенные формы 7 :

    int main (void)
    int main (int argc, char *argv[])
    /* or in some other implementation-defined manner. */
    
  • C11 автономная среда

    Разрешается любая форма или имя главного 8 .


Обратите внимание, что int main() никогда не указывалось в качестве допустимой формы для любой размещенной реализации C в любой из вышеуказанных версий. В C, в отличие от C ++, () и (void) имеют разные значения. Первый является устаревшей функцией, которая может быть удалена из языка. См. C11 будущие языковые направления:

6.11.6 Объявление функций

Использование деклараторов функций с пустыми скобками (не деклараторы типа параметров в формате prototype) является устаревшей функцией.


  • C ++ 03 размещенная среда

    Разрешенные формы 9 :

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

    Комментарии:

    Обратите внимание на пустые скобки в первой форме. C ++ и C в этом случае различны, потому что в C ++ это означает, что функция не принимает параметров. Но в C это означает, что он может принимать любой параметр.

  • C ++ 03 автономная среда

    Имя функции, вызываемой при запуске, определяется реализацией. Если он назван main(), он должен следовать указанным формам 10 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    
  • C ++ 11 размещенная среда

    Разрешенные формы 11 :

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

    Комментарии:

    Текст стандарта был изменен, но он имеет то же значение.

  • C ++ 11 автономная среда

    Имя функции, вызываемой при запуске, определяется реализацией. Если он назван main(), он должен следовать указанным формам 12 :

    // implementation-defined name, or 
    int main ()
    int main (int argc, char *argv[])
    

Ссылки

  1. ANSI X3.159-1989 2.1.2.2 Размещенная среда. «Запуск программы»

    Функция, вызываемая при запуске программы, называется основной.реализация не объявляет прототип для этой функции. Это должно быть определяется с типом возврата int и без параметров:

    int main(void) { /* ... */ } 
    

    или с двумя параметрами (упоминается здесь как argc и argv, хотя могут использоваться любые имена, так как они являются локальными для функция, в которой они объявлены):

    int main(int argc, char *argv[]) { /* ... */ }
    
  2. ANSI X3.159-1989 2.1.2.1 Отдельно стоящая среда:

    В автономной среде (в которой выполнение программы на С может занять место без какой-либо выгоды операционной системы), название и тип функции, вызываемой при запуске программы, определяются реализацией.

  3. ISO 9899: 1999 5.1.2.2 Размещенная среда -> 5.1.2.2.1 Запуск программы

    Функция, вызываемая при запуске программы, называется основной. реализация не объявляет прототип для этой функции. Это должно быть определяется с типом возврата int и без параметров:

    int main(void) { /* ... */ } 
    

    или с двумя параметрами (именуемыми здесь argc и argv, хотя могут использоваться любые имена, так как они являются локальными для функция, в которой они объявлены):

    int main(int argc, char *argv[]) { /* ... */ }
    

    или эквивалентный; 9) или в некоторых других определенных реализацией способ.

  4. Обоснование международного стандарта - языки программирования - C, редакция 5.10. 5.1.2.2 Размещенная среда -> 5.1.2.2.1 Запуск программы

    Поведение аргументов main и взаимодействия exit, main и atexit (см. §7.20.4.2) была кодифицирована, чтобы обуздать некоторое нежелательное разнообразие в представлении argv Строки и значения значений, возвращаемых main.

    Спецификация argc и argv в качестве аргументов для main признает обширную предшествующую практику. argv [argc] должен быть нулевым указателем для обеспечения избыточной проверки конца списка, также на основе обычной практики.

    main - единственная функция, которая может быть объявлена ​​переносимым образом либо с нулем, либо с двумя аргументами. (Количество аргументов других функций должно точно совпадать между вызовом и определением.) Этот особый случай просто признает широко распространенную практику исключения аргументов из main, когда программа не имеет доступа к строкам аргументов программы. Хотя многие реализации поддерживают более двух аргументов для main, такая практика не благословлена ​​и не запрещена Стандартом; программа, которая определяет main с тремя аргументами, не является строго соответствующей (см. §J.5.1.).

  5. ISO 9899: 1999 5.1.2.2 Размещенная среда -> 5.1.2.2.3 Завершение работы программы

    Если возвращаемый тип главной функции является типом, совместимым с int, возврат из начального вызова основной функции эквивалентен вызову функции выхода со значением, возвращаемым главной функцией в качестве аргумента; 11) достижение }, который завершает основную функцию, возвращает значение 0. Если возвращаемый тип не совместим с int, состояние завершения, возвращаемое в хост-среду, не указывается.

  6. ISO 9899: 1999 5.1.2.1 Отдельно стоящая среда

    В автономной среде (в которой выполнение программы на С может осуществляться без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются реализацией.

  7. ISO 9899: 2011 5.1.2.2 Размещенная среда -> 5.1.2.2.1 Запуск программы

    Этот раздел идентичен приведенному выше C99.

  8. ISO 9899: 1999 5.1.2.1 Отдельно стоящая среда

    Этот раздел идентичен приведенному выше C99.

  9. ISO 14882: 2003 3.6.1 Основная функция

    Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь возвращаемый тип типа int, но в остальном его тип определяется реализацией. Все реализации должны позволять оба следующих определения main:

    int main() { /* ... */ }
    

    и

    int main(int argc, char* argv[]) { /* ... */ }
    
  10. ISO 14882: 2003 3.6.1 Основная функция

    Определяется реализацией, требуется ли программе в автономной среде для определения главной функции.

  11. ISO 14882: 2011 3.6.1 Основная функция

    Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь возвращаемый тип типа int, но в остальном его тип определяется реализацией. Все реализации должны разрешить оба

    - функция (), возвращающая int и

    - функция (int, указатель на указатель на символ), возвращающая int

    как тип основного (8.3.5).

  12. ISO 14882: 2011 3.6.1 Основная функция

    Этот раздел идентичен приведенному выше C ++ 03.

28 голосов
/ 15 октября 2008

Возвращает 0 в случае успеха и ненулевое значение в случае ошибки. Это стандарт, используемый сценариями UNIX и DOS для выяснения того, что случилось с вашей программой.

8 голосов
/ 27 декабря 2011

main() в неопределенных типах возврата C89 и K & R C по умолчанию равно int.

return 1? return 0?
  1. Если вы не напишете инструкцию возврата в int main(), закрывающий { по умолчанию вернет 0.

  2. return 0 или return 1 будут получены родительским процессом. В оболочке она переходит в переменную оболочки, и если вы запускаете свою программу из оболочки и не используете эту переменную, вам не нужно беспокоиться о возвращаемом значении main().

См. Как я могу получить то, что вернула моя основная функция? .

$ ./a.out
$ echo $?

Таким образом, вы можете видеть, что это переменная $?, которая получает младший байт возвращаемого значения main().

В сценариях Unix и DOS обычно возвращается return 0 в случае успеха и ненулевое значение в случае ошибки. Это стандарт, используемый сценариями Unix и DOS для выяснения того, что случилось с вашей программой, и контроля всего потока.

7 голосов
/ 15 октября 2008

Помните, что даже если вы возвращаете int, некоторые ОС (Windows) усекают возвращаемое значение до одного байта (0-255).

4 голосов
/ 01 июля 2011

Возвращаемое значение может использоваться операционной системой для проверки того, как была закрыта программа.

Возвращаемое значение 0 обычно означает ОК в большинстве операционных систем (те, о которых я могу думать в любом случае).

Его также можно проверить, когда вы сами вызываете процесс и посмотрите, правильно ли он завершил работу и завершился.

Это НЕ просто соглашение о программировании.

3 голосов
/ 02 июля 2011

Возвращаемое значение main() показывает, как программа вышла. Если возвращаемое значение равно zero, это означает, что выполнение было успешным, в то время как любое ненулевое значение будет означать, что что-то пошло не так в выполнении.

...