Подтвердить что ты не робот

Main() в C

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

  • Все функции должны быть объявлены в их прототипе функции, а затем в их определении. Почему нам не нужно сначала объявлять функцию main() в прототипе?

  • Почему мы должны использовать int main() вместо void main()?

  • Что возвращает 0 именно в функции main()? Что произойдет, если я напишу программу, заканчивающую функцию main() с помощью return 1;, например?

4b9b3361

Ответ 1

  • Для правильного вызова функции нужно либо определение, либо прототип, но main никогда не должен вызываться из любой другой функции, поэтому он не должен быть объявлен.
  • Потому что стандарт C так говорит. Операционные системы передают возвращаемое значение вызывающей программе (обычно это оболочка). Некоторые компиляторы принимают void main, но это нестандартное расширение (обычно это означает "всегда возвращать ноль в ОС" ).
  • По соглашению, ненулевое возвращаемое значение сигнализирует об ошибке. Сценарии оболочки и другие программы могут использовать это, чтобы узнать, успешно ли ваша программа успешно завершена.

Ответ 2

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

Не верно. Простой пример:

void foo(){}  //definition

int main()
{
    foo();
    return 0;
}

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


2) Почему мы должны использовать int main() вместо void main()?

Потому что стандарт говорит так. (Чтобы быть более точным, это верно в среде размещения, которая обычно имеет место)

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

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

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

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

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

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


3) Что возвращает 0 именно в функции main()? Что произойдет, если я напишу программу, заканчивающую функцию main() с возвратом 1, например?

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

Ответ 3

Вы не можете выбрать тип возврата основного , потому что вы не написали код, который вызывает основной. Основной вызов кода уже существовал, прежде чем вы даже подумывали об обучении C. Он был написан людьми, предоставляющими код запуска C, который обычно автоматически связан с вашим исполняемым файлом без вашего ведома. Этот код часто находится в файле crt0.o(созданном из crt0.c или даже ассемблером в crt0.s). Он ожидает использовать возвращаемое значение, указывающее успех (0) или отказ (отличное от нуля), плюс, возможно, другую информацию, например, был ли код завершен из-за сигнала, и если да, то какой. Это биты истории Unix, которые я не буду повторять здесь: -)

Ответ 4

1) Не обязательно; определение также служит декларацией. Во-вторых, в любом случае для main существует только несколько действительных сигнатур для main, и вы обычно не вызываете main в свой код, если вы не пишете запись для IOCCC.

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

3) По соглашению (по крайней мере, на системах * nix, где C сначала использовался), статус 0 указывает на успех, а ненулевой статус указывает... что-то иное, кроме успеха. Точно какое значение соответствует тому, какой статус соответствует реализации.

Ответ 5

1) это неверно, вы можете только создать определение функции.

2), мы можем знать, правильно ли закончена функция main()

3) то же самое, за исключением того, что в вашей оболочке будет выдан 1 вместо 0

Ответ 6

Функции необязательно должны быть объявлены сначала как прототип. Такое объявление необходимо, только если нам нужно использовать функцию до ее определения.

main имеет тип int по определению.

Значение значения, возвращаемого из основного, является обычным. Общепринятое соглашение состоит в том, что 0 считается успехом, а не 0 -ным отказом.

Ответ 7

1. Функция main() неявно вызывается библиотекой C, распознавая встроенное ключевое слово "main". Поэтому нам не нужно объявлять прототип основной функции.

2.Это я не уверен, но я думаю, что это зависит от типа используемого редактора. В Turbo C будет принят void main(), тогда как в dev-cpp main() должно вернуть значение.

3.return 0 просто выходит из программы с статусом выхода 0, другими словами, возвращаемое значение определяет статус выхода основного потока.

Ответ 8

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

Теперь конкретно: 1) Из-за соответствия, как я сказал. Вам не нужно объявлять, потому что инструментальные цепочки и операционные системы уже знают о главном. Также существуют другие функции соответствия, такие как exit().

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

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

Дополнительная информация: main() на самом деле не функция FIRST (вы написали), которая будет вызываться при запуске программы. НО фактически операционные системы и цепочки инструментов облегчают другие вызовы до вашего основного, настраивать среду, выполнять инициализацию или что-то еще. Но вы не знаете об этом непосредственно, когда пишете свой код, и вам не нужно это разбираться и думать об этом вообще. Во встроенных системах обычно будут выполняться функции очень низкого уровня, предназначенные для настройки основных часов процессора, прерываний, стека и т.д. Некоторые из цепей инструментов, таких как IAR, фактически могут позволить вам выполнить свой собственный код до того, как вызывается main.

Надеюсь, это помогло:)