[英]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.