为什么我必须在使用该类型之前声明一个不相关的struct file_handle变量?

时间:2015-06-20 05:12:50

标签: c linux

遵循Linux open_by_handle_at()的文档:

http://man7.org/linux/man-pages/man2/open_by_handle_at.2.html

我写这个C文件:

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef void (*foobar) (struct file_handle *);

但它会发出不祥的警告:

>gcc -c foobar.c
warning: ‘struct file_handle’ declared inside parameter list

如果我在其间添加不相关的声明:

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

struct file_handle *junk;

typedef void (*foobar) (struct file_handle *);

然后它会在没有警告的情况下编译。为什么警告??

1 个答案:

答案 0 :(得分:0)

您尚未提前声明struct file_handle。编译器第一次在上面的函数定义中看到struct file_handle。在每种情况下,struct file_handle的声明都具有块范围,即它对应于相应函数的本地。

在功能之前添加以下结构。

 struct file_handle {
                   unsigned int  handle_bytes;   /* Size of f_handle [in, out] */
                   int           handle_type;    /* Handle type [out] */
                   unsigned char f_handle[0];    /* File identifier (sized by
                                                    caller) [out] */
               };

高级语言允许您将声明/定义放在任何地方(例如C ++或Python),但不幸的是,C是从上到下编译的