在C中设置结构-给出奇怪的错误

在C中设置结构-给出奇怪的错误,c,C,我在C程序中设置了这样的结构: typedef struct header block_header; struct header { size_t size; block_header *next_pointer; block_header *prev_pointer; }; 但是,当我运行以下任何表达式时: int myinit() { block_header *p = init_heap_segment(BLOCK_HEAD_SIZE); // et

我在C程序中设置了这样的结构:

typedef struct header block_header;

struct header {
    size_t size;
    block_header *next_pointer;
    block_header *prev_pointer;
};
但是,当我运行以下任何表达式时:

int myinit()
{
    block_header *p = init_heap_segment(BLOCK_HEAD_SIZE);

// etc etc
}
它为声明它的每个函数提供了几个错误:

allocator.c: In function ‘myinit’:
allocator.c:37:38: error: ‘header’ undeclared (first use in this function)
allocator.c:37:38: note: each undeclared identifier is reported only once for each function it appears in
allocator.c: In function ‘function’:
allocator.c:67:2: error: unknown type name ‘header’
它的设置方式有什么问题?如何消除这些错误

编辑:定义:

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header)))
这是你的问题

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header)))
您的程序中没有
header
这样的类型,这是编译器告诉您的。您已经为它定义了类型
struct header
,并且定义了类型定义名称
block_header
。因此,选择您喜欢的:要么
sizeof(struct header)
要么
sizeof(block\u header)
。但不是
sizeof(标题)

在C++语言中定义了一个<代码>结构头(<代码> >类型),也将Type NeX<代码>头>代码导入程序中。但不在C中。在C中,由
struct header
定义的类型称为
struct header
-两个单词。它不能被缩短为仅仅一个
标题

这是您的问题

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header)))
您的程序中没有
header
这样的类型,这是编译器告诉您的。您已经为它定义了类型
struct header
,并且定义了类型定义名称
block_header
。因此,选择您喜欢的:要么
sizeof(struct header)
要么
sizeof(block\u header)
。但不是
sizeof(标题)


在C++语言中定义了一个<代码>结构头(<代码> >类型),也将Type NeX<代码>头>代码导入程序中。但不在C中。在C中,由
struct header
定义的类型称为
struct header
-两个单词。在您的程序中,不能将其缩短为一个
标题

,没有称为
标题
的类型。但是你正在使用

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header))) // problem
应该是-

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(struct header)))


无论何时像这样计算尺寸,请确保使用了正确的参数

在您的程序中,没有称为
头的类型。但是你正在使用

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header))) // problem
应该是-

#define BLOCK_HEAD_SIZE (ALIGN(sizeof(struct header)))

无论何时像这样计算尺寸,请确保使用了正确的参数

为什么不干脆做:

typedef struct block_header {
    size_t size;
    block_header *next_pointer;
    block_header *prev_pointer;
}header;
有了这些,你可以:

header *p = init_heap_segment(BLOCK_HEAD_SIZE);
使用init_heap_segment()的新声明,其中返回“header*”而不是“struct block_header*”。更干净。

为什么不做:

typedef struct block_header {
    size_t size;
    block_header *next_pointer;
    block_header *prev_pointer;
}header;
有了这些,你可以:

header *p = init_heap_segment(BLOCK_HEAD_SIZE);

使用init_heap_segment()的新声明,其中返回“header*”而不是“struct block_header*”。更干净。

错误消息与您发布的代码不匹配。你需要发布相关代码。您引用的
myinit
行本身无法生成此类错误消息,除非错误被
BLOCK\u HEAD\u SIZE
隐藏。块头大小是多少?宏?1)显示
BLOCK\u HEAD\u SIZE
init\u heap\u segment()的定义。2) 评论中可能有打字错误。@chux我现在已经编辑过了。提供了另一个函数的代码,我们必须假设它没有问题。错误消息与您发布的代码不匹配。你需要发布相关代码。您引用的
myinit
行本身无法生成此类错误消息,除非错误被
BLOCK\u HEAD\u SIZE
隐藏。块头大小是多少?宏?1)显示
BLOCK\u HEAD\u SIZE
init\u heap\u segment()的定义。2) 评论中可能有打字错误。@chux我现在已经编辑过了。另一个函数的代码已经提供,我们必须假设它没有问题。谢谢!我会在几分钟内接受答案。谢谢!我会在几分钟内接受答案。不是问题,兄弟…虽然这看起来更好,但不会导致错误。没问题。至少在错误消失后,真正的问题可以得到解决。:)不是问题,兄弟…虽然这看起来更好,但它并没有导致错误。没问题。至少在错误消失后,真正的问题可以得到解决。:)