2017-04-25 103 views
1

我有一個在file1.h中定義的枚舉。我想把這個枚舉作爲另一個文件file2.h中的一個參數,而不包括file1.h。現在我必須從file3.h中調用get_color()函數。我得到兩個不同的錯誤類型:存儲大小未知:枚舉

  1. 通過從兼容的指針類型「get_color」的參數1 [-Werror]
  2. 錯誤1解決了,但我得到一個不同的錯誤:山坳ISN的存儲大小不知道。

唯一的問題是我不能在file2.h中包含file1.h。請建議我如何解決這個問題。

file1.h

typedef enum { 
    RED, 
    BLUE, 
    GREEN2, 
} colors_t; 

file2.h

void get_color(enum colors_t *col); 

file3.h //選項1

#include "file1.h" 
#include "file2.h" 
int main() 
{ 
    colors_t col; 
    get_color(&col); //error: passing argument 1 of 'get_color' from incompatible pointer type [-Werror] 

} 

file3.h //選項2

#include "file1.h" 
#include "file2.h" 
int main() 
{ 
    enum colors_t col; 
    get_color(&col); //error: storage size of col isn't known. 

} 
+0

我可能是錯的,但是這不是類型定義是如何工作的。它是'colors_t',成爲類型,而不是'enum colors_t'。就像結構一樣。 – grochmal

+0

請注意,應該是'file3.c'或'main.c',而不是'file3.h'。如果你在一個文件中有函數定義,它可能不是頭文件。 – Schwern

+1

如果你想使用'enum colors_t'和'colors_t',寫:'typedef enum colors_t RED, BLUE, GREEN2, } colors_t;'。否則,選擇一個並堅持下去。 –

回答

5

get_colors簽名應該是...

void get_color(colors_t *col); 

類型是colors_t。不是enum colors_t;沒有這種類型。


我相信問題是瞭解typedef如何工作。 typedef爲類型創建一個名稱。

typedef <type> <alias>; 

對於簡單的類型,這是非常簡單的。這個別名unsigned charuint8_t

typedef unsigned char uint8_t; 

對於結構和枚舉,很容易混淆。

typedef enum { 
    RED, 
    BLUE, 
    GREEN2, 
} colors_t; 

該類型是enum { RED, BLUE, GREEN2 }。別名是colors_t

在這種情況下,該類型沒有其他名稱;這是一個匿名的enum,它只能被colors_t引用。

你可以給它一個名字。

typedef enum colors { 
    RED, 
    BLUE, 
    GREEN2, 
} colors_t; 

現在同樣的類型可以被稱爲enum colorscolors_t

我建議不要這樣做,因爲它可以讓人們穿透由typedef提供的封裝面紗。也就是說,如果每個人都使用colors_t,則可以在幕後以微妙的方式更改它。

1

只需更改您的代碼:

typedef enum { 
    RED, 
    BLUE, 
    GREEN2, 
} colors_t; 

void get_color(colors_t *col) 
{ 
    /// get_color body 
} 

int main(int argc, char **argv) 
{ 
    colors_t col; 
    get_color(&col); 

    return 0; 
}