无法解释编译器警告

时间:2012-09-02 12:55:19

标签: c

我的编译器(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上)。

5 个答案:

答案 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*标准选项)。