在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
在函数体内被向前声明?我们怎么不声明它的论点呢?
答案 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);
}