Есть ли причина, по которой я никогда не вижу основной прототип, объявленный в программах на C, т.е.
int main(int argc, char* argv[]);
int main(int argc, char* argv[])
{
return 0;
}
Всегда казалось непоследовательным.
Есть ли причина, по которой я никогда не вижу основной прототип, объявленный в программах на C, т.е.
int main(int argc, char* argv[]);
int main(int argc, char* argv[])
{
return 0;
}
Всегда казалось непоследовательным.
Стандарт языка C, черновик n1256:
5.1.2.2.1 Запуск программы
1 Функция, вызванная при запуске программы, называетсяmain
. Реализация не объявляет прототип для этой функции. Он определяется с типом возвратаint
и без Параметры: Аренда на отпускint main(void) { /* ... */ }
или с двумя параметрами (называемыми здесьargc
иargv
, хотя любые имена могут быть используются, поскольку они являются локальными для функции, в которой они объявлены):int main(int argc, char *argv[]) { /* ... */ }
или эквивалент; 9) или каким-либо другим способом реализации.
Акцент мой.
Объявление прототипа означает, что вы хотите вызвать его в другом месте, что не имеет смысла для функции main().
Нет необходимости в прототипе, так как main
не должен вызываться другими процедурами (а в С++ вызов main
фактически запрещен).
Простая причина в том, что управление всегда сначала переходит к основному. Таким образом, автоматически устанавливается компилятором, поэтому его прототип избыточен и бесполезен.
Также мы используем прототип, когда вызов функции выполняется до его определения. Таким образом, просмотр компилятора прототипа функции может решить, является ли вызов законным или нет. Но в случае основного мы привыкли предоставлять его определение наряду с его объявлением (что также логически корректно), поэтому нет необходимости в прототипе.
Даже когда мы делаем наши c-программы организованными в несколько файлов, нет необходимости в прототипе основного.
Первоначальная цель прототипов состояла в том, чтобы поддерживать прямые ссылки на функции, которые могут обрабатываться однопроходными компиляторами.
Другими словами, если у вас есть что-то вроде этого:
void function_A(){
printf( "%d", function_B( 5 ) );
}
int function_B( int x ){
return x * 2;
}
function_B вызывается до того, как она будет определена. Это создаст проблемы для простых компиляторов. Чтобы избежать этих проблем, размещение прототипов в начале файла гарантирует, что компилятор заранее знает обо всех функциях в файле, поэтому прямые ссылки не являются проблемой для проверки типов.
Так как все допустимые формы главной функции заранее известны компилятору, нет необходимости создавать прототип, потому что компилятор может проверить тип прямой ссылки на main() без него.