簡體   English   中英

在C中使用前向聲明的typedef stuct

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

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