2011-04-15 75 views
4

我有一個「.c .h」夫婦。 在.h中定義了2個typedef結構,比如說TS1和TS2typedef知名度

現在,TS1的一個成員是TS2類型。 我想只使TS1可見,但不能TS2。 TS2應該只對相對.c文件可見。

我該怎麼做?

+0

成員聲明爲指針或結構? – tia 2011-04-15 14:04:59

回答

5

我喜歡用'-internal'後綴命名專用頭文件。對於你的例子,我會有

foobar.c 
    #include "foobar-internal.h" 
    #include "foobar.h" 
    /* functions using `struct TS1` and `struct TS2` */ 

foobar.h 
    #ifndef H_FOOBAR_INCLUDED 
    #define H_FOOBAR_INCLUDED 
    struct TS1; 
    #endif 

foobar-internal.h 
    #ifndef H_FOOBAR_INTERNAL_INCLUDED 
    #define H_FOOBAR_INTERNAL_INCLUDED 
    struct TS2 { int whatever; }; 
    struct TS1 { int whatever; struct TS2 internal; }; 
    #endif 

使用功能的任何代碼,包括簡單的"foobar.h"並且可以使用指針struct TS1。它不能直接使用struct TS1struct TS2類型的對象。事實上,通過只包含"foobar.h",代碼不知道在任何地方都存在類型,並且可以將其重新定義爲自己的目的。

usercode.c 
    #include "foobar.h" 
    struct TS1 *x; 
    x = newTS1(); 
    work(x); 
    destroyTS1(x); 
+0

請注意'私人'不是C中的關鍵字。 – fnokke 2011-04-15 14:29:52

+0

@fnokke:謝謝。我將標識符更改爲內部以避免混淆。 – pmg 2011-04-15 14:42:53

+0

但是,當foobar-internal.h'永遠不會被包含在任何地方時,編譯器如何知道'TS1'和'TS2'的定義? – 2012-06-25 15:10:24

0

AFAIK,這是不可能的。但是您可以爲TS1和TS2設置兩個不同的.h文件。

2

我同意Rumple。

你可以做的是#define TS2 int在.h和#undef TS2位於.c文件頂部的#include之後。

雖然這不使用typedef。如果你想在多個.c文件中使用#include,你也可以在.h文件的底部輸入#undef