非类typedef的c++正向声明

c++ forward declaration for a non-class typedef

本文关键字:声明 c++ typedef 非类      更新时间:2023-10-16

我有这个:

//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兼容的方式转发声明Foo?

这是一个过于简单的例子,当然在这里很琐碎,但这个想法有多个实现,比如:

//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..
}

并使用预处理器指令选择其中一个。(这无关紧要,只是为了表明这个例子并不愚蠢)。

为什么不能将typedef放在前面。若您声明函数具有给定自定义类型的参数(无论是class还是typedef),您也需要以某种方式声明此类。

与指向类/结构的指针一样,即使类成员未知(=sizeof(pointer)),大小也是众所周知的。在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不是一个好主意。

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

您只需要转发声明具有实现的类。Typedef没有实现。