Хрестоматия по программированию на Си в Unix




Текстовая обработка. Хрестоматия по программированию на Си в Unix - стр. 2


то компилятор сообщит об ошибке (так как нет преобразования типа (char *) в double). Прототип принуждает компилятор проверять:

  • соответствие ТИПОВ фактических параметров (при вызове) типам формальных параметров (в прототипе);
  • соответствие КОЛИЧЕСТВА фактических и формальных параметров;
  • тип возвращаемого функцией значения.
  • Прототипы обычно помещают в include-файлы. Так в ANSI стандарте Си предусмотрен файл, подключаемый

    #include <stdlib.h>

    в котором определены прототипы функций из стандартной библиотеки языка Си. Черезвычайно полезно писать эту директиву include, чтобы компилятор проверял, верно ли вы вызываете стандартные функции.

    Заметим, что если вы определили прототипы каких-то функций, но в своей программе используете не все из этих функций, то функции, соответствующие "лишним" прототипам, НЕ будут добавляться к вашей программе из библиотеки. Т.е. прототипы - это указание

    компилятору; ни в какие машинные команды они не транслируются. То же самое касается описаний внешних переменных и функций в виде

    extern int x; extern char *func();

    Если вы не используете переменную или функцию с таким именем, то эти строки не имеют никакого эффекта (как бы вообще отсутствуют).

    Обратная задача: напишите преобразователь из нового стиля в старый.

    int f( int x, char *y ){ ... }

    переводить в

    int f( x, y ) int x; char *y; { ... }

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

    ------- файл a.c ------- void g(void); void h(void);

    int x = 0, y = 13;

    void f(int arg){ printf("f(%d)\n", arg); x = arg; x++; }

    int main(int ac, char *av[]){ h(); f(1); g(); printf("x=%d y=%d\n", x, y); return 0; }

    ------- файл b.c ------- extern int x, y;




    Содержание  Назад  Вперед