2015-04-22 34 views
6

我在想如何編寫一個函數,該函數返回一個函數指針,該函數返回一個函數指針,而沒有typedef。例如它返回一個函數指針可以被定義爲一個函數:如何聲明一個函數,該函數返回的指針返回的函數指針不使用C中的typedef?

type (*f_name(..))(..){..} 

所以這會返回一個指針,它返回一個「類型」的功能,現在你怎麼聲明功能,如果「類型」是函數指針。但是因爲我的主管不想使用typedefs,所以我不能使用它們。

感謝您提供任何幫助。

+0

只需用一個未命名的函數指針替換'type'即可。 –

+4

你的主管不需要typedefs?多麼奇怪的想法...... 目前還不清楚你想要什麼。你只是想要一個函數返回一個函數指針,還是你希望它遞歸地作爲函數指針返回函數? 你有什麼嘗試? – Eregrith

+0

先用''typedef''來執行,然後手動解析''typedef''。 – Philip

回答

7

對於像這樣的問題,有一個叫做cdeclhttp://cdecl.org/)的漂亮實用程序,它可以在英語和C語言之間進行轉換。

例如

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long 

給出了答案

long (*(*f(int))(char))(void) 

,並在另一個方向上,

cdecl> explain int (*(*g(float))(double, double))(char) 

聲明克作爲函數(浮點)返回指針功能(雙,雙 )返回指針功能(炭)返回int

+2

順便說一句,有它的web界面:http:// cdecl。org/ – myaut

+1

是的,只是添加了網址。感謝您的提醒。 – drRobertz

+0

謝謝,這個工具很好,給出的答案是我正在尋找。 – user3711004

3

首先我們寫一個函數採取一個int並返回一個浮子。

float First(int f) 
{ 
    return (float)f ; 
} 

然後我們寫一個函數無所取,並返回一個指向函數獲取int和返回浮動。
該指針與First相同。

float (*Second(void))(int) 
{ 
    float (*f)(int) = First ; 

return f ; 
} 

最後,我們寫一個函數取一個char並返回一個指針的函數無所取,並返回一個指向函數獲取int和返回浮動。該指針與Second相同。

float (*(*Third(char c))(void))(int) 
{ 
    (void)c ; 
    float (*(*s)(void))(int) = Second ; 

return s ; 
} 

如果將沿着彼此的原型,怪異的語法開始變得有意義:

float  First     (int) ; 
float ( *Second   (void))(int) ; 
float (*(*Third(char))(void))(int) ; 

到返回一個非函數指針的唯一區別是,函數指針參數走在最後的聲明和括號:

  type* Name(void) ; 
function_type (*Name(void))(int) ;