2012-01-06 95 views
2

我有這樣的:C++的非類向前聲明的typedef

//forward declaration of Foo <-- this is my question 
void doSome(Foo foo); 

typedef void* Foo; //Foo is defined later as void* 

void doSome(Foo foo) 
{ 
    //code here.. 
} 

我怎樣才能向前用void兼容的方式宣告富*?

這是一個簡化的示例,當然是微不足道這裏,但這個想法是具有多個實施方式中,像這樣:

//forward declaration of Foo <-- this is my question 
void doSome(Foo foo); 

//[implementation1_internal.h] 
typedef void* Foo; //Foo is defined later as void* 

void doSome(Foo foo) 
{ 
    //code here.. 
} 

//[implementation2_internal.h] 
typedef int* Foo; //Foo is defined later as int* 

void doSome(Foo foo) 
{ 
    //code here.. 
} 

,並選擇使用預處理器指令其中之一。 (這是無關緊要的,只是爲了展示這個例子不僅僅是愚蠢的)。

+0

爲什麼不能事先使用typedef? – rtpg 2012-01-06 13:13:37

+0

它是平凡的可能(或向前移動聲明,同樣的事情)。無論如何,在定義「Foo」之前,您實際上無法調用「doSome(Foo)」。 – MSalters 2012-01-06 13:18:30

+0

這只是一個例子。我將爲Foo和doSome在多個頭文件中提供多個聲明 – Hugo 2012-01-06 13:19:11

回答

0
typedef void* Foo; 

void doSome(Foo foo); 

void doSome(Foo foo) 
{ 
    //code here.. 
} 

您只需要轉發聲明具有實現的類。 Typedefs沒有實現。

1

爲什麼不能在之前使用typedef。如果你聲明瞭具有給定自定義類型的參數的函數(無論是class還是typedef),你也需要以某種方式聲明這個類。

如指針類/結構的情況下,該大小是(=的sizeof(指針)),在Typedef的類型的情況下,該大小不能除非已知即使類成員是未知的完全公知的您提供完整的typedef聲明。

因此,解決方案是在您的函數聲明之前放置typedef

你應該有:

// declarations 
typedef void* Foo; //Foo is defined later as void* 
void doSome(Foo foo); 

// definitions 
void doSome(Foo foo) 
{ 
    //code here.. 
} 

如果不能修改的定義,由於某種原因,你可以重複的typedef兩次(只要兩者都是非衝突/如出一轍):

// declarations 
typedef void* Foo; 
void doSome(Foo foo); 

// definitions 
typedef void* Foo; 
void doSome(Foo foo) 
{ 
    //code here.. 
} 

問題編輯後編輯

最好的辦法是將有重載函數:

void doSome(void* foo) 
    { 
     // void* version 
    } 

    void doSome(int* foo) 
    { 
     // int* version 
    } 

這不是一個好主意,有各地的項目不同Foo秒。

+0

感謝Krizz,如果你想,看看我的版本,也許會澄清我的需要。 – Hugo 2012-01-06 13:30:02

+0

這樣編輯我的答案。 – Krizz 2012-01-06 13:37:23