我在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)))
答案 0 :(得分:5)
这是你的问题
#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header)))
程序中没有header
这样的类型,这是编译器告诉你的。您已定义类型struct header
,并为其定义了typedef名称block_header
。因此,请根据您的喜好选择:sizeof(struct header)
或sizeof(block_header)
。但不是sizeof(header)
。
在C ++语言中,定义struct header
类型也会在程序中引入typename header
。但不在C中。在C中,struct header
定义的类型称为struct header
- 两个单词。它不能简化为header
。
答案 1 :(得分:0)
在你的程序中,没有名为header
的类型。但是你正在使用
#define BLOCK_HEAD_SIZE (ALIGN(sizeof(header))) // problem
应该是 -
#define BLOCK_HEAD_SIZE (ALIGN(sizeof(struct header)))
或
#define BLOCK_HEAD_SIZE (ALIGN(sizeof(block_header)))
无论何时计算这样的大小,请确保使用正确的参数!
答案 2 :(得分:0)
为什么不这样做:
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 *'。更干净。