2015-11-04 60 views
0

如果我有一個源文件mystruct.c和一個相應的頭文件,在每個文件中定義它的正確方法是什麼?結構:什麼應該去頭,什麼應該在源?

假設我具有這樣的結構:

typedef struct my_struct { 
    int a; 
} MyStruct; 

它應該被置於這樣在頭?還是應該看起來更像是這樣的:

源文件:

struct my_struct { 
    int a; 
}; 

頭文件:

typedef struct my_struct MyStruct; 

我有枚舉和工會同樣的問題。

我基本上是在尋找定義這些東西的標準方法,以便它們可以在許多其他文件中使用,而不必擔心重定義錯誤。

+3

這一般不能回答。這取決於你需要聲明的地方。作爲一般規則:放入頭文件中必須存在的內容,並在源文件中留下可以留在那裏的內容。 – 5gon12eder

+1

如果您希望所有文件都能夠直接訪問結構的字段,那麼第一種方法是正確的方法。第二種方式不適用於這種情況,因爲包含頭文件的文件不會知道結構字段(除非您在每個源文件中定義結構)。第二種方法仍然適用於不同的用例 - 不透明的定義。 – kaylum

回答

2

在.c文件中定義結構的內容,只是聲明結構存在於頭中意味着你需要提供一個函數來創建結構,例如,

rc = my_struct_create(&s); 

它,你可以改變你的結構的內容,而無需重新編譯代碼相關的優勢 - 這是因爲結構是不透明的,只有這樣,才能創造它與您的功能,只有這樣,才能訪問結構的任何成員將通過你定義的函數。

我個人建議使用庫代碼的方法。否則,這取決於你想要達到的目標。

+0

那麼這與OOP語言的私有和公共類似嗎?標題中的東西是公開的,而源中的東西是私人的?我聽說C++中的類只是具有函數的結構......在非常基礎的層面上,這是如何實現私有和公共字段的? – JDOdle

+0

是的,基本上是一個不透明的結構,你只有私有成員和一個完整定義的結構,你有公共成員。 – ralight

+0

如果您使用內聯函數,這是不可用的。或者如果你實現了一個面向對象的方法。 – Olaf

0

在.h文件中,你乾脆把結構定義,函數原型:

point.h

typedef struct { 
    int x, y; 
} point; 

point *initpt(int, int); 

在.c文件,你會實現的功能:

point.c

point *initpt(int x, int y) 
{ 
    point *p; 

    p->x = x; 
    p->y = y; 

    return p; 
} 
0

這取決於結構成員是否是公共API的一部分。如果API的用戶不應訪問結構成員,則僅將結構定義保留爲.c文件。如果他們應該知道結構的實現(例如,因爲你想讓他們訪問結構的成員),把結構定義放在.h中。原則上首先是限制性更強,然後如果你也有,那麼你以後可以改變它。