Нужно ли возвращать значение в Main()?

Я как раз писал быструю программу для вычисления некоторых вещей, когда наткнулся на оператор return/exit для программы C.

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

Я знаю, что стандартный способ создать программу на C-это вернуть значение, чтобы любые проблемы могли быть отсортированы, среди прочего, но не Boolean работать так же? Кроме того, могу ли я уйти, объявив это void и не имея проблем с операционной системой, все еще работает моя программа после ее завершения?

Спасибо за любую помощь.

7 ответов


стандарт C99 гласит: (§5.1.2.2.1 программа запуска)

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

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

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

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

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

Итак, в размещенной среде,int является единственным допустимым стандартным типом возврата. Однако реализации могут определять другие точки входа.

обратите внимание, что раздел §5.1.2.2.3 Завершение Программы это:

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

Итак, вы опускаете возвращение из main является законным в C99, пока ваш main возвращает int.
(Но предыдущие версии из стандарта C не было этого исключения для main - возврат значения нет (или достижение конечного } без оператора return) причины "состояние завершения, возвращенное в среду хоста [быть] undefined.".)


здесь ссылке это может быть интересно. Кажется, ответ на твой вопрос не так прост. Я также видел компиляторы (MS Visual C), принимающие void в качестве возвращаемого типа.


резюме: вы не обязательно должны, но вы должны.

в C90, дойдя до конца main() без заключения return оператор "состояние завершения, возвращаемое в среду хоста, не определено". По крайней мере, в одной системе, которую я использовал, возвращенный статус равен 1, что в этой системе указывает на сбой программы.

C99 добавил новое правило, сказав, что дойдя до конца main() возвращает 0. (C++ имеет то же правило.) Не все компиляторы полностью реализуйте C99, и те, которые часто не ведут себя как соответствующие компиляторы C99 по умолчанию.

только переносных значений можно вернуться из main() равны 0, EXIT_SUCCESS и EXIT_FAILURE (последние два определены в <stdlib.h>. 0 и EXIT_SUCCESS укажите, что программа выполнена успешно (и EXIT_SUCCESS обычно определяется как 0); EXIT_FAILURE указывает на сбой программы. return 1; является распространенным, но непереносимым; я работал над системой (VMS), где статус завершения 1 указывает на успех. Если вы хотите, чтобы ваша программа была портативной, используйте EXIT_FAILURE чтобы указать на неудачу; вот для чего это. Некоторые системы и программы определяют другие системные или прикладные коды состояния.

для переносимости (и, IMHO, стиль), лучше всего сделать явный return 0; в конце main(), хотя это не требуется во всех случаях. Гораздо проще добавить эту строку кода (которая в худшем случае безвредна), чем тратить время на определение того, нужна ли вам он.

обратите внимание, что правильные определения для main() являются:

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

и

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

или эквивалент (например, вы можете написать char **argv, а не char *argv[]). Сомнительно, что int main() { /* ... */ } действительно, по тонким причинам я не буду здесь вдаваться. Опять же, проще добавить void ключевое слово, чем тратить время, определяя, нужно ли вам это.

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


код, вызывающий main (), ожидает, что он вернет int (или вызов exit ()). Вы не можете изменить код, вызывающий main ()(это часть ОС или среды выполнения), поэтому вам лучше вернуться int.


стандарт, согласно ISO, должен возвращать int. См. раздел 5.1.2.2.1 настоящего документа:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf. Также интересен комментарий Страуструпа по этому вопросу, относящийся как к C, так и к c++:http://www2.research.att.com / ~bs / bs_faq2.html#void-главная.


тип возврата должен быть int, как и другие ответы. Однако ваше предположение, что вы должны вернуть значение вообще из-за этого неправильно, main исключение. Стандарт C99 предусматривает это, поэтому прекрасно реализовать main без использования return.


в ANSI C,main () обычно имеет тип возврата int, но он может быть фактически определен реализацией; это означает, что разные компиляторы и платформы принимают разные подписи, но int main () и int main (int, char**) are гарантированный по стандарту, чтобы быть хорошо сформированным.

он не похож на другие не-пустые функции, в том, что ему не нужен return заявление. В случае, если ни один не указан, а тип возврата указан как int, затем программа скомпилировано, как если бы было неявное return 0; после последнего заявления в main ().

соответствующая часть стандарта:

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

1 если возвращаемый тип main функция-это тип, совместимый с int, a return от первоначальный вызов main функция эквивалентна вызову