[英]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.