2013-01-07 63 views
4

gcc似乎在告訴我int foo(int (*f)(void))相同int foo(int (f)(void)) f是一個指針,以無參數返回int的功能。爲什麼我們可以在這裏省略*。我也試過int (*p)(void)int (p)(void)。第一個p是一個函數指針,而第二個是函數。所以*函數指針可以省略?

那麼,發生了什麼?在什麼情況下可以省略星號? 我在K & R中查找並沒有發現任何東西。

回答

7

從我的哈比森和斯蒂爾(第5版,第9.3節)的副本報價:

在參數列表中,鍵入「函數返回T」被隱式改寫爲有型「指向返回T的函數」。

這意味着在形式參數列表的上下文中,它們是等價的。在任何其他情況下,它們都是不同的。

作爲一種風格,我永遠不會忽略*。

+0

謝謝。我也知道在調用指向函數時,(* f)()和f()是一樣的。 – TheoYou

+2

@TheoYou:是的,由於有關函數類型表達式的隱式轉換的單獨規則。即使在常規函數調用'func(arg)'中,表達式'func'也會隱式轉換爲一個指針,這是'()'函數調用「operator」所需要的。在數組中,類似的事情發生在參數聲明和表達式中。 –

+0

@凱瑟湯普森謝謝。這種隱式轉換解釋了許多特殊情況。 – TheoYou

相關問題