Объявить основной прототип - PullRequest
12 голосов
/ 16 февраля 2011

Есть ли причина, по которой я никогда не вижу прототипа main, объявленного в программах на C, а именно:

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

int main(int argc, char* argv[])
{
    return 0;
}

Всегда казалось несовместимым

Ответы [ 5 ]

10 голосов
/ 16 февраля 2011

Стандарт языка C, черновик n1256 :

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

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

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

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

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

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

Акцент мой.

6 голосов
/ 16 февраля 2011

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

2 голосов
/ 16 февраля 2011

Простая причина в том, что элемент управления всегда сначала переходит на main.Таким образом, автоматически определяется компилятором , поэтому его прототип избыточен и бесполезен.

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

Даже когда мы делаем наши c-программы организованными в несколько файлов, нет необходимости в прототипе main .

2 голосов
/ 16 февраля 2011

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

0 голосов
/ 18 января 2019

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

Другими словами, если у вас есть что-то вроде этого:

void function_A(){
    printf( "%d", function_B( 5 ) );
}

int function_B( int x ){
    return x * 2;
}

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

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

...