获取错误未知类型名称' size_t'即使我已经包含了相关的C库和标题

时间:2018-02-07 18:38:07

标签: c netfilter

请在下面找到我的代码。 我收到错误" /usr/include/linux/sysctl.h:40:2:错误:未知类型名称'size_t'"

在线搜索,唯一的建议是确保您的代码中包含stddef.h,我可以在下面看到。在我已尝试过的修复程序之外似乎没有可用的解决方案,因此我目前对如何继续前进感到不知所措。

另请注意,此代码并不漂亮,但这不是此主题的主要问题。我得到的错误看起来并不是因为我的代码中的错误而被抛出,但我可能错了。

#include <linux/netfilter_ipv4.h>
#include <linux/netfilter.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <sys/types.h>
#include <linux/module.h>
#include <stddef.h>

struct nf_hook_ops{

        struct list_head *list;

        nf_hookfn *hook;

        struct module *owner;

        u_int8_t pf;

        unsigned int hooknum;

        int priority;    /* Hooks are ordered in ascending priority. */

};

int nf_register_hook(struct nf_hook_ops *reg);

void nf_unregister_hook(struct nf_hook_ops *reg);


struct nf_hook_ops nfho = {

    nfho.hook = hook_func_in,     

    nfho.hooknum = NF_INET_LOCAL_IN,     

    nfho.pf = PF_INE, 

    nfho.priority = NF_IP_PRI_FIRST
};

nf_register_hook(&nfho);         // Register the hook

1 个答案:

答案 0 :(得分:6)

C严格从上到下进行解析,#include执行纯文本包含,而不是任何有资格获得“模块导入”名称的聪明人。因此,#include指令的顺序很重要。在这种情况下,您收到有关stddef.h定义的类型的投诉,因此您必须确保之前包含<{1}} ,是)另一个头文件。

我可以使用以下两行源文件重现您所获得的错误:

stddef.h

#include <linux/sysctl.h>
#include <stddef.h>

如果我更换$ gcc -fsyntax-only test.c In file included from test.c:1:0: /usr/include/linux/sysctl.h:39:2: error: unknown type name ‘size_t’ 行的顺序,

#include

然后没有错误。这是#include <stddef.h> #include <linux/sysctl.h> 中的一个错误,但我不会屏住呼吸来修复它。我建议将linux/sysctl.h移到包含列表的最顶部。

我可以使用您的实际包含列表重现问题

stddef.h

但是#include <linux/netfilter_ipv4.h> #include <linux/netfilter.h> #include <linux/ip.h> #include <linux/tcp.h> #include <sys/types.h> #include <linux/module.h> #include <stddef.h> 转储没有显示gcc -H被这组包含传递过来,所以可能只是因为我在我的Linux机器上有一个不同版本的内核头文件而不是你做的