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

chr*_*omy 4 c unix

UNIX编程环境的第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);
}
Run Code Online (Sandbox Code Playgroud)

这条线FILE *fp, *fopen();做什么?

我的阅读是它声明了一个变量fp,它是一个指向a FILE的函数和一个fopen返回指针的函数FILE.

如果是这样的话:为什么fopen在函数体内声明了前向?为什么我们不宣布其论点?

Cor*_*lks 8

它创建一个名为fp(类型FILE *)的局部变量,并且forward声明一个名为fopen(带有签名FILE *fopen())的外部函数.

fopenC中函数声明中缺少参数并不意味着该函数采用零参数(函数签名将是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);
}
Run Code Online (Sandbox Code Playgroud)