[英]error: redefinition of typedef in c
我们在学校有一个作业,我们有一个 header 文件,我们需要实现它。 header 定义:
typedef struct Board* BoardP;
据我了解,这意味着 BoardP 是指向 struct Board 的指针。 无论如何,我的实现是:
typedef struct Board
{
int width;
int height;
char *board;
} *BoardP;
但我不断得到:
Board.c:21: error: redefinition of typedef ‘BoardP’
Board.h:4: note: previous declaration of ‘BoardP’ was here
关于为什么会发生这种情况的任何想法? 谢谢!
编辑:另一个问题。 如您所见,我的结构包含一个字符数组。 当我写一个构造函数时,我应该先初始化 (malloc(sizeof(height*width)) 数组然后再初始化结构吗?那么使用 free() 怎么样?我应该先释放数组然后再释放结构吗?谢谢
发生这种情况是因为在您预先编写的 header 文件中,您必须为其编写一个实现,您已经将数据类型struct Board *
输入定义为“新”数据类型BoardP
。 您对BoardP
是指向数据类型struct Board
的指针的解释是正确的。
但是,要使 header 中的代码正常工作,您只需定义缺少的内容,在这种情况下,仅是struct Board
数据类型的实现。
如果您在 header 文件中还没有 typedef,那么您提出的解决方案将起作用。
由于您已经在 header 文件中拥有它,因此只有 cnicutar 提出的代码(没有typedef
的代码)应该放在.c文件中。
关于你的第二个问题...
您可以按您喜欢的任何顺序malloc
,但我通常在尝试分配任何子对象之前分配 object 本身,因为这样您就有一个清晰的位置来存储子对象malloc
的结果而不是在结构中将它们存储在其他无用的临时变量中。
确保正确处理您的错误 - 如果第二个malloc
失败,您需要free
第一个。 这其实是很多 C 程序员喜欢使用goto
的地方:
struct Board *makeBoard(...)
{
struct Board *b = malloc(sizeof *b);
if(b == NULL) goto end1;
b->board = malloc(...);
if(b->board == NULL) goto end2;
// ...
end2:
free(b);
end1:
return NULL;
}
free
数据时,必须在free
主对象之前释放子对象,除非在free
主 object 之前将指向所有子对象的指针存储在临时变量中。 也就是说,以下内容不起作用:
free(b);
free(b->board);
因为通过第二条语句, b
是free
的 d 并且无法安全地取消引用。 以相反的顺序执行它是最干净的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.