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

Объявить основной прототип

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

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

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

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

4b9b3361

Ответ 1

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

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

1 Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототип для этой функции. Он определяется с типом возврата int и без Параметры: Аренда на отпуск int main(void) { /* ... */ }

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

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

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

Акцент мой.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

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