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

时间:2014-08-13 18:29:41

标签: 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);

// 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)))

3 个答案:

答案 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 *'。更干净。