2010-07-12 311 views
6

我有兩個c文件,具有功能的foo.c和測試foo.c的功能的te​​st_foo.c。如何聲明extern typedef結構體?

有沒有辦法訪問struct typedef BAR我在test_foo.c中的foo.c中定義的,而不使用頭文件?到目前爲止,我能夠避免一個h文件,因此整個程序將由foo.c組成。謝謝。

foo.c 
typedef struct BAR_{...} bar; 
BAR *bar_new(...) {..} 

test_foo.c 
extern BAR *bar_new(...) 

error: expected declaration specifiers or ‘...’ before ‘BAR’

回答

6

答案是有一個,你應該使用頭文件來代替。 您可以將結構typedef struct BAR_{...} bar;的定義複製到test_foo.c,它將起作用。但是這會導致重複。 每個工作的解決方案都必須使test_foo.c中的編譯器可用的結構體實現。 如果在這種情況下適合您,也可以使用ADT。

+1

只有在test_foo.c(或foo.c以外的任何其他模塊)需要訪問內容結構本身時,將定義移動到頭文件纔是正確的解決方案。如果是ADT或其他原因,test_foo.c不需要類型的內部消息,我認爲前向聲明是更好的解決方案。 – harald 2010-07-12 10:42:47

+1

現在,我只是將定義複製到其他c文件中。 – Framester 2010-07-12 12:48:30

+0

我正在做同樣的事情 - 我正在開發一個測試工具,應該包裝生產代碼。在生產守則中,結構定義沒有公開的業務,應該被埋沒。因此我必須將定義複製到我的測試工具中。這是重複的,但我的鏈接器足夠聰明,可以給我警告,如果一個變化,而不是另一個。 – Nick 2014-12-03 23:35:51

1

您將需要供電條的定義test_foo.c。重複是否優於標題取決於您。

4

刪除typedef。

在foo.c的:

struct bar 
{ 
    ... 
}; 

struct bar *bar_new(....) 
{ 
    return malloc(sizeof(struct bar)); 
} 

在test_foo.c:

struct bar; 

struct bar *mybar = bar_new(...); 

請注意,你只能得到一個結構條物體的存在,這樣,在test_foo.c用戶不知道對象的內容。

+0

你可以保留typedef,然後在foo.c中將其強制轉換爲void。 – Nick 2014-12-03 23:29:00