簡體   English   中英

錯誤:在 c 中重新定義 typedef

[英]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() 怎么樣?我應該先釋放數組然后再釋放結構嗎?謝謝

從定義中刪除typedef

struct Board
{
    int width;
    int height;
    char *board;
};

一個結構就是一個結構; 它不像你總是必須typedef它。 老實說,我只為不透明的指針typedef structs

style(9)

避免對結構類型使用 typedef。 Typedef 是有問題的,因為它們沒有正確隱藏其底層類型; 例如,您需要知道 typedef 是結構本身還是指向結構的指針。 此外,它們必須只聲明一次,而不完整的結構類型可以根據需要多次提及。

發生這種情況是因為在您預先編寫的 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);

因為通過第二條語句, bfree的 d 並且無法安全地取消引用。 以相反的順序執行它是最干凈的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM