2012-01-06 96 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