我的编译器(
gcc)在声明fp的行上抛出警告(而不是错误!)
int fd = open("filename.dat",O_RDONLY); FILE* fp = fdopen(fd,"r"); // get a file pointer fp from the file descriptor fd
这些是警告:
main.c: In function ‘main’: main.c:606: warning: implicit declaration of function ‘fdopen’ main.c:606: warning: initialization makes pointer from integer without a cast
我不明白这些警告,因为fopen的返回值是一个FILE *.我在这里犯的错误是什么?
解决方法
简短的答案:在编译时使用-std = gnu99,通常的标准是非POSIX,没有fdopen.
warning: implicit declaration of function ‘fdopen’
意味着您忘记包含fdopen()声明所在的头文件,然后由编译器发出隐式声明,这意味着未知函数的返回值将被假定为int,因此是第二个警告.你必须写
#include <stdio.h>
编辑:如果您正确地包含stdio.h,则fdopen()可能不在您所定位的系统上可用.你在Windows上吗此功能仅适用于POSIX.
编辑2:对不起,我真的应该感觉到这一点. C99意味着ANSI C99标准 – 标准C不强制文件描述符的概念以支持非POSIX系统,因此它仅提供fopen(). fdopen()与文件描述符相关,所以它只是POSIX,所以它不是标准C99的一部分.如果您使用GCC的-std = gnu99开关,则可以摆脱标准的限制,并允许在POSIX和仅限GNU的扩展中实质上解决问题.