Что такое «прототипы» в программе C?

Книга, которую я использую, чтобы узнать С, объясняет то, что называется «прототипами», которые я не мог понять правильно. В этой книге следующий образец кода объясняет эти «прототипы». Что это значит? Каковы «прототипы»?

//* two_func.c -- a program using two functions in one file */ #include  void butler(void); int main(void) { printf("I will summon the butler function.\n"); butler(); printf("Yes! bring me some tea and writable DVD's.\n"); getchar(); return 0; } void butler(void) /*start of function definition*/ { printf("You rang,sir.\n"); } 

Пожалуйста, объясните это простым языком.

    Прототипы функций (также называемые «форвардными декларациями») объявляют функции без предоставления «тела» сразу. Вы пишете прототипы в дополнение к самим функциям, чтобы сообщить компилятору о функции, которую вы определяете в другом месте:

    Ваш прототип void butler(void); выполняет все следующие действия:

    • Он сообщает компилятору, что функция butler существует,
    • Он говорит, что butler принимает никаких параметров, и
    • Это говорит о том, что butler ничего не возвращает.

    Прототипы полезны, потому что они помогают вам скрывать детали реализации функции. Вы помещаете свои прототипы в файл заголовка вашей библиотеки и помещаете реализацию в файл C. Это позволяет коду, который зависит от вашей библиотеки, быть скомпилирован отдельно от вашего кода – очень важная вещь.

    Это прототип:

     void butler(void); 

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

    Если ваш код был

     #include  int main(void) { butler(); // note this line } void butler() { return; } 

    Компилятор остановился бы на note this line разделе note this line , жалуясь на то, что butler() не существует. Сначала он не будет сканировать весь файл для функций, он просто остановится при первом неопределенном вызове функции, с которым он сталкивается.

    Прототип содержит возвращаемый тип функции, ее имя и порядок различных типов параметров, которые вы передаете. Если вы напишете определение функции перед вызовом функции, то прототип не нужен. Но, как и в вашем примере, функция butler() вызывается перед ее определением, поэтому прототип необходим, чтобы сообщить компилятору, что существует такая функция, которая будет иметь так называемый тип и параметры возврата. В противном случае запись определения функции после вызова функции приведет к ошибке.

    В этом контексте прототип является более общим термином для того, что в C будет называться объявлением функции, то есть:

     void butler(void); 

    Вы также можете найти его под названием function signature . Оба термина на самом деле ссылаются больше на то, как butler() определяется с концептуальной точки зрения, как функция, которая не принимает никаких аргументов и не возвращает значение, а скорее то, что для ее объявления достаточно для вас используйте его в своем исходном коде.

     void butler(void); 

    Вызывается прототипом или декларацией функции.

    И ниже – определение функции.

     void butler(void) /*function definition */ { printf("You rang,sir.\n"); }