【问题标题】:c++ forward declaration for a non-class typedef非类typedef的c ++前向声明
【发布时间】:2012-01-06 13:09:48
【问题描述】:

我有这个:

//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?
  • 这是微不足道的可能(或将前向声明向下移动,同样的事情)。在定义Foo 之前,您实际上不能调用doSome(Foo)
  • 这只是一个例子。我将在多个头文件中对 Foo 和 doSome 进行多个声明
  • "这无关紧要,只是为了说明例子不傻" 其实我想说这个例子很傻——你为什么要颠覆像这样的类型系统?如果函数应该能够采用不同的指针类型,则将它们设为函数模板...

标签: c++ typedef forward-declaration


【解决方案1】:

为什么不能把 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
  }

在您的项目周围使用不同的Foos 不是一个好主意。

【讨论】:

  • 感谢 Krizz,如果你愿意,请查看我的版本,也许会澄清我需要什么。
【解决方案2】:
typedef void* Foo;

void doSome(Foo foo);

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

您只需要前向声明具有实现的类。 Typedef 没有实现。

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多