[英]typedef stuct with forward declaration in C
我有類似的東西:
typedef struct Data DATA, *DATA_PTR;
typedef struct Units UNITS, *UNITS_PTR;
struct Data
{
double miscData;
UNITS units;
};
struct Units
{
double x[2];
double y[2];
double z[2];
};
在我的project_typedef.h
文件中。
在另一個文件中,我有類似的東西:
void fileInput(DATA_PTR data)
{
//usual declarations and other things
data->miscData = 0; //Works!
data->units.x[0] = 5; //Doesn't work
//etc...
}
但是,這不起作用,因為單元是在project_typedef.h
數據之后聲明的(如果我切換它的工作順序)。 我得到的錯誤是“左'.x'必須有struct / union類型”。 我認為前方聲明會解決這個問題。 為什么不?
定義 Data
,所有成員必須是完整類型。 由於UNITS
在那時不是一個完整的類型,這不起作用。 (相比之下, UNITS_PTR
會很好,因為指向不完整類型的指針是完整的類型。)
只需將Units
定義放在Data
定義之上,就可以了。
(正如@cnicutar已經注意到的那樣,你也使用了數組x
錯誤。)
前向聲明允許您在允許不完整類型的上下文中使用其名稱。 聲明結構成員不是這種情況之一,必須知道完整定義,因為它有助於結構布局。
對於結構定義,您應該始終對結構中的所有成員使用完整類型...但struct Data
UNITS units
不是這種情況,它聲明了一個名為units
類型struct Units
的變量,它從未在struct Data之前聲明...這反映了一個錯誤..您應該將Units
定義放在Data
定義之上..並且所有都可以正常工作..
因為無論什么時候定義結構變量,編譯器首先分配結構所需的內存( 結構成員不要分配給它們的內存,除非它們鏈接到結構類型的變量 ..)為什么struct變量不能在struct template中初始化).. :)
struct沒有原型。 這是因為編譯器在使用之前需要知道struct的大小。 你可以在struct上使用指針,因為無論指針指向哪種類型,指針都有已知的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.