c++ Что должно main () возвращать в C и C ++?



9 Answers

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

ISO / IEC 9899: 1989 (C90):

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() из программы.

ISO / IEC 9899: 1999 (C99):

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

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



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




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




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

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

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

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

$ ./a.out
$ echo $?

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

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




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




Возврат 0 должен сообщить программисту, что программа успешно завершила работу.




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

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

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




В C ++ основная функция должна быть объявлена ​​как int main (), а не void main (), поскольку компилятор затем выдает ошибку в случае void main. Основная функция может принимать любое количество аргументов, таких как int main (int k, int l, int arr []) или int main (void).

#include <iostream>
using namespace std;

int main(void) {
    // your code goes here
    cout<<"a";
    return 0;
}

Выход:

Success #stdin #stdout 0s 4416KB
a

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

пример

#include <iostream>
using namespace std;

int main(int k,float m,char g, int arr[]) {
    // your code goes here
    k=0;
    cout<<k;
    g='a';
    cout<<g;
    cout<<"a";
    return 1;
}

Выход:

Runtime error   #stdin #stdout 0s 4448KB
0aa



не указывать return 0

Когда программа C или C ++ достигает конца, mainкомпилятор автоматически генерирует код для возврата 0, поэтому нет необходимости return 0;явно указывать его в конце main.

Примечание: когда я делаю это предложение, он почти всегда сопровождается одним из двух видов комментариев: «Я этого не знал». или «Это плохой совет!» Мое обоснование заключается в том, что безопасно и полезно полагаться на поведение компилятора, явно поддерживаемое стандартом. Для C, поскольку C99; см. раздел 5.1.2.2.3 ISO / IEC 9899: 1999:

[...] возврат от начального вызова mainфункции эквивалентен вызову exitфункции со значением, возвращаемым mainфункцией в качестве аргумента; достигая того, }что завершает mainфункцию, возвращает значение 0.

Для C ++, начиная с первого стандарта в 1998 году; см. раздел ИСО / МЭК 14882: 1998 раздел 3.6.1:

Если элемент управления достигает конца main без столкновения с оператором return, это эффект выполнения return 0;

Все версии обоих стандартов с тех пор (C99 и C ++ 98) сохранили ту же идею. Мы полагаемся на автоматически сгенерированные функции-члены в C ++, и немногие люди пишут явные return;инструкции в конце voidфункции. Причины против упущения, похоже, сводятся к «это выглядит странно» . Если, как и я, вам любопытно, почему обоснование изменения стандарта C прочитало этот вопрос . Также обратите внимание, что в начале 1990-х годов это считалось «неряшливой практикой», поскольку в то время это было неопределенное поведение (хотя и широко поддерживаемое).

Поэтому я защищаю его; другие не согласны (часто яростно!). В любом случае, если вы столкнетесь с кодом, который его опускает, вы поймете, что он явно поддерживается стандартом, и вы поймете, что это значит.




Related