2016-11-25 70 views
-2

我想聲明的方法typedef,它包括方法類型本身的指針參數 - 這可能嗎?如何聲明的方法指針的類型定義方法參數

的方法看起來是這樣的:

void myFunc(FuncType* pFunc, int a) {} 

其中myFunc是匹配FuncType聲明,這樣我就可以設置一個變量,並調用它像這樣:

FuncType f = myFunc; 
f(&f, 5); 

我試着聲明一個typedef匹配該方法爲:

typedef void (*FuncType)(FuncType*, int); 

但是這不起作用,因爲FuncType在完全聲明之前是必需的。我可以通過將參數設置爲一個void指針來解決這個問題,但是有一些解決方法;或許通過某種形式的FuncType前向申報?

回答

1

這是不可能的;一個函數不能接受它自己類型的參數(或者返回這樣的東西)。
這是所有相當強大型系統的情況。

唯一的解決方法是通過另一種類型引入一個間接,爲您void*一樣。

這類似於一個類如何不能包含自己的一個實例作爲一個成員,你可以通過指針或引用來解決問題。

+0

是的,我是這麼認爲的。我想通過將參數聲明爲指向類型的指針,我可以像結構和類一樣逃避它。很明顯不是。 – adelphus

0

你不僅可以不是聲明這樣一個typedef,你也不能聲明這樣一個函數。它導致無限遞歸。

這裏有這樣一個函數聲明會是什麼樣子:

void myFunc(void (*pFunc)(...), int a); 

其中...將擴展爲:

void (*pFunc)(...), int) 

其中...將擴展爲:

void (*pFunc)(...), int) 
+0

哪裏遞歸?我所做的只是調用一個函數並將它傳遞給一個指針和一個整數。 – adelphus

+0

@adelphus的「遞歸」是在類型級別,而不是在函數本身。 – molbdnilo

+0

好吧,我明白了。我不同意的原因是參數是一個**類型的指針**,而不是類型本身。這是你如何聲明結構和類沉不住氣的一員 - 你聲明一個指向結構或類和類型系統管理梳理出來。 – adelphus

相關問題