什么是“ FILE * fp,* fopen();”做?

时间:2018-08-12 20:44:40

标签: c unix

The UNIX Programming environment的第182页上,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在函数体内被向前声明?我们怎么不声明它的论点呢?

1 个答案:

答案 0 :(得分:7)

它将创建名为fp(类型为FILE *)的局部变量,并向前声明an external function named fopen (with a signature of FILE *fopen())

C中的fopen函数声明中缺少参数并不表示该函数接受零个参数(该函数签名为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);
}
相关问题