簡體   English   中英

非類typedef的C ++前向聲明

[英]c++ forward declaration for a non-class 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 *兼容的方式轉發聲明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放在前面。 如果聲明函數具有給定的自定義類型的參數(類或typedef),則還需要以某種方式聲明該類。

與指向類/結構的指針一樣,即使不知道類成員,其大小也是眾所周知的(= sizeof(pointer)),對於類型定義的類型,除非您提供了完整的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沒有實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM