переопределение functoin как int K & R 6.3 - PullRequest
2 голосов
/ 14 октября 2019

В главе 6.3 K & R функция getword () определяется следующим образом:

int getword(char *word, int lim)
{
    int c, getch(void);
    void ungetch(int);
    char *w = words;

    while(isspace(c=getch()))
        ;
        if(c!= EOF)
            *w++; = c;
        if(isalpha(c)) {
            *w = '\0';
            return c;
        }

        for(;--lim > 0; w++)
            if(!isalnum(*w)getch()){
                ungetch(*w);
                break;
            }
        *w = '\0';
        return word[0];
}

Я не понимаю синтаксис строки

int c, getch(void);

я впервые вижу это. Почему он объявляет функцию как int? Разве не достаточно вставить прототипы функций перед их вызовом?

1 Ответ

4 голосов
/ 14 октября 2019

Представьте, что строка

int c, getch(void);

эквивалентна

int c;
int getch(void);

То есть это объявление переменной int с именем c, за которой следует прототипдля функции с именем getch, не принимающей аргументов и возвращающей int.

. Как показывает этот пример, между "объявлениями" и "прототипами функций" в Си нет жесткой границы. Прототип функции - это просто объявление, который объявляет тип функции, который включает в себя типы ее аргументов.

Это немного необычно, но вовсе не неправильно, объявлять прототип функции с локальной областью действия, подобной этой. Обычно прототип функции объявляется «вверху» исходного файла с глобальной областью действия вне какой-либо функции. (Фактически, обычно прототипы функций объявляются в заголовочных файлах.)

Почему она объявляет функцию как int?

Ну, потому что функция getch возвращает возвращает int.

Разве не достаточно вставить прототипы функций перед их вызовом?

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

Суть в том, что каждое объявление функции в C является "внешним", независимо от того, появляется оно внутриили вне функции, содержит ли она спецификатор класса хранения extern или нет.

...