12

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

我不明白这些警告,因为返回值为fopena FILE*。我在这里犯了什么错误?

编辑:我包括stdio.h(我也在 Linux 上)。

4

5 回答 5

15

简短回答-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 的一部分。如果您使用-std=gnu99GCC 的开关,它会摆脱标准的限制并允许 POSIX 和 GNU-only 扩展,从根本上解决您的问题。

于 2012-09-02T12:57:32.507 回答
2
#define _XOPEN_SOURCE 600
#include <stdio.h>

这完全符合严格的 c99

gcc -std=c99 -pedantic -Wall -Wextra -Werror
于 2013-09-03T18:52:27.033 回答
1

您没有#include <stdio.h>在 C 中包含编译器,因此“猜测”您尝试调用的函数的声明。(以您所基于的参数并使用 int 作为返回值)。通常你不希望这样的猜测,因此编译器会警告你。

解决方案:添加适当#include的 s。

于 2012-09-02T12:58:54.520 回答
0

如果您在标准 C 模式下编译,该fdopen函数不是 C 标准的一部分,也不能作为标准头文件的一部分使用。因此,您要么需要使用-std=gnu99而不是-std=c99编译源代码,要么自己声明函数。

于 2012-09-02T13:11:36.530 回答
0

@H2CO3 的回答中对编译器的诊断有一个很好的解释,所以让我们只看一下事情的原因:如果您使用的是 glibc(而且您可能是),某些 POSIX 函数可能需要特定的功能测试宏才能显示。

特别是,您可能需要输入以下行:

#define _POSIX_SOURCE
// or #define _XOPEN_SOURCE

#include <stdio.h>

某些编译器(例如 gcc)也具有相同效果的命令行选项(gnu*gcc 中的所有标准选项)。

于 2012-09-02T14:12:21.280 回答