2011-11-16 77 views
5

我有這樣的:在我project_typedef.h文件的typedef與向前聲明stuct用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]; 
}; 

在另一個文件中,我有這樣的:

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類型」。我認爲前面的聲明可以解決這個問題。爲什麼不?

+3

首先,==看起來很奇怪...... – Tudor

+0

@Tudor,一個錯字,但這不是它在我的代碼中。現在編輯出來。 – user1007692

+3

我只是想告訴我,當我看到用作普通類型的指針類型時,我討厭。 DATA_PTR不會以任何方式簡化寫代碼,因爲它仍然是指針,並且您仍然必須使用 - >運算符。 –

回答

10

當你定義Data,所有成員必須是完整的類型。由於UNITS在這一點上不是一個完整的類型,這是行不通的。 (相比之下,UNITS_PTR是很好的,因爲指向不完全類型是完全類型。)

簡而言之上述Data定義Units定義,你應該罰款。

(如@cnicutar已經指出的那樣,你還使用數組x錯誤。)

5

前向聲明允許您在允許不完整類型的上下文中使用它的名稱。聲明一個結構體成員不是這種情況之一,完整的定義必須是已知的,因爲它有助於結構體佈局。

1

沒有原型結構。這是因爲編譯器在使用它之前需要知道struct的大小。你可以在struct上使用指針,因爲無論指向哪種類型的指針都具有已知的大小。

0

你應該總是使用完整的類型結構中的所有成員結構的定義......但這不是與UNITS unitsstruct Data,其中聲明瞭一個名爲struct Unitsunits這是從來沒有的結構之前聲明的變量的情況下數據......這反映了一個錯誤..你應該把Units定義上述Data定義..一切都將正常工作..

和關於提前聲明,這並不工作,因爲當一個結構體變量的定義,編譯器首先分配結構所需的內存(結構成員不分配給他們的內存,除非他們ar e鏈接到一個結構類型的變量 ..那就是爲什麼結構變量不能初始化結構模板內).. :)