尽管我已经包含了相关的C库和标头,但我仍然会收到错误消息"unknown type name 'size_t'"。

4
请查看下面的代码。 我得到了错误“/usr/include/linux/sysctl.h:40:2: error: unknown type name ‘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

5
在你的代码中我看不到任何size_t。尝试在其他头文件之前包含<stddef.h> - machine_1
1
@machine_1 我也看到了。我认为 OP 应该发布完整的错误消息,显示“包括自......包括自......包括自......”,因为这可能会让问题变得明显。 - Mawg says reinstate Monica
1
系统头文件的相对顺序不应该有影响,但是可能内核源代码还没有完全跟上这个变化。 - John Bollinger
1
我的代碼中沒有提到 size_t,我知道。這似乎是使用其他庫引用的庫的編譯錯誤。請在此 imgur 鏈接中找到完整的錯誤消息 https://imgur.com/a/nY7J3 - Crumblez
1
好的,哇,将 #include <stddef.h> 移到代码顶部似乎解决了这个错误。谢谢大家! - Crumblez
显示剩余2条评论
1个回答

7
C语言严格按照自上而下的顺序解析,而#include只是简单地进行文本包含,而不是任何聪明到足以称为“模块导入”的东西。因此,#include指令的顺序可能很重要。在这种情况下,您会收到有关由stddef.h定义的类型的投诉,因此必须确保在需要stddef.h的内容(实际上也是另一个头文件)之前,先包含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 的 bug,但我不会指望它被修复。我建议将 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/sysctl.h,所以很可能只是因为我在我的Linux盒子上有一个不同版本的内核头文件而已。


这个有效,非常感谢!这是一个非常奇怪的错误,我自己想不到。 - Crumblez
你应该学到的更普遍的教训是,在C语言中,#include的顺序可能很重要。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接