我的编译器(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*
。我在这里犯的错是什么?
编辑:我包括stdio.h
(我也在Linux上)。
答案 0 :(得分:12)
简短回答:编译时使用-std=gnu99
,通常的标准是非POSIX,没有fdopen
。
warning: implicit declaration of function ‘fdopen’
意味着您忘记包含fdopen()
声明所在的头文件。然后编译器发出隐式声明 - 这意味着未知函数的返回值将被假定为{{ 1}} - 因此第二次警告。你必须写
int
编辑:如果您正确包含stdio.h,那么您所定位的系统上可能无法使用#include <stdio.h>
。你在Windows上吗?此功能仅限POSIX。
编辑2:对不起,我真的应该感觉到这一点。 C99表示ANSI C99标准 - 标准C不强制文件描述符的概念以支持非POSIX系统,因此它仅提供fdopen()
。 fopen()
与文件描述符有关,因此它只是POSIX,所以它不是标准C99的一部分。如果您使用GCC的fdopen()
开关,它将摆脱标准的限制,并允许在POSIX和GNU专用扩展中,基本上解决您的问题。
答案 1 :(得分:2)
你没有在C中包含#include <stdio.h>
编译器因此“猜测”你试图调用的函数的声明。 (取你所基于的参数并使用int作为返回值)。通常你不需要这样的猜测,因此编译器会警告你。
解决方案:添加适当的#include
s。
答案 2 :(得分:1)
#define _XOPEN_SOURCE 600
#include <stdio.h>
这完全符合严格的c99
gcc -std=c99 -pedantic -Wall -Wextra -Werror
答案 3 :(得分:0)
fdopen
函数不是C标准的一部分,如果在标准C模式下编译,则不能作为标准头文件的一部分使用。因此,您需要使用-std=gnu99
而不是-std=c99
来编译源代码或自行声明函数。
答案 4 :(得分:0)
对于编译器在@ H2CO3的答案中的诊断有一个很好的解释,所以让我们只看看为什么:如果你正在使用glibc(你可能是),某些POSIX函数可能会需要特定的功能测试宏才能显示。
特别是,您可能需要添加以下行:
#define _POSIX_SOURCE
// or #define _XOPEN_SOURCE
前
#include <stdio.h>
某些编译器(例如gcc)也有相同效果的命令行选项(gcc中的所有gnu*
标准选项)。