在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在函数体内声明了前向?为什么我们不宣布其论点?
它创建一个名为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)