Какво означава FILE *fp, *fopen(); правя?

На страница 182 от Средата за програмиране UNIX кодът за efopen е посочен както следва:

FILE *efopen(file, mode)    /* fopen file, die if can't */
    char *file, *mode;
{
    FILE *fp, *fopen();
    extern char *progname;

    if ((fp = fopen(file, mode)) != NULL)
        return fp;
    fprintf(stderr, "%s: can't open file %s mode %s\n",
        progname, file, mode);
    exit(1);
}

Какво прави редът FILE *fp, *fopen();?

Моето четене е, че той декларира променлива fp, която е указател към FILE и функция fopen, която връща указател към FILE.

Ако е така: Защо fopen forward се декларира в тялото на функцията? Защо не декларираме аргументите му?


person chromy    schedule 12.08.2018    source източник
comment
Книгата (която в много отношения е отлична) е написана през 1984 г., пет години преди първия C стандарт. Колкото и да е странно, той не използва функции, открити само в стандартния C, като например прототипи на функции. Всички C вече са остарели по подобен начин - в света на компютрите малко книги издържат промените от 30+ години напълно невредими. Ще трябва да разберете предварително стандартния (K&R 1st Edition) C, за да го използвате добре. Има няколко места, където е трудно да се съгласува кодът с модерния C - но не много.   -  person Jonathan Leffler    schedule 13.08.2018
comment
Ако наистина се затрудните с преобразуване на код от книгата, свържете се с мен по имейл — вижте профила ми.   -  person Jonathan Leffler    schedule 13.08.2018


Отговори (1)


Той създава локална променлива с име fp (от тип FILE *) и препраща декларира външен функция с име fopen (със сигнатура FILE *fopen()).

Липсата на параметри в декларацията на функцията fopen в C не означава, че функцията приема нула параметри (сигнатурата на тази функция би била FILE *fopen(void)). Вместо това липсата на параметри означава, че функцията има неуточнени параметри (неуточнено количество и неуточнен тип).

Това е наистина стара форма на C, която би била по-идиоматично написана в съвременния C като:

#include <stdio.h>   // fopen() and fprintf()
#include <stdlib.h>  // exit()
#include <string.h>  // strerror()
#include <errno.h>   // errno

extern char *progname;

FILE *efopen(const char *file, const char *mode) {
    FILE *fp = fopen(file, mode);
    if (fp) return fp;

    fprintf(stderr, "%s: can't open file %s in mode %s: %s\n",
            progname, file, mode, strerror(errno));
    exit(1);
}
person Cornstalks    schedule 12.08.2018
comment
Буквално никога не съм виждал C кодова база, в която отворената къдрава скоба на дефиницията на функция отива в края на реда, както го правите вие. JavaScript, да, C, никога. Откъде го взе? - person zwol; 13.08.2018
comment
@zwol: Google. И може би подсилено чрез писане на Objective-C (което несъмнено е различен език, но някои кодови бази поставят скобата на същия ред като селектора на метода и за последователност направете същото с обикновените C функции в Objective-C файл; кодът на Apple (към който направих връзка) не не го демонстрирам, но някои други кодови бази го правят). - person Cornstalks; 14.08.2018