2010-11-23 130 views
2

老師們,我的教授給我們分配了一個涉及與數組,指針和函數打字的任務。現在,在你用全部的「我們不會爲你做功課」的事情跳上前,我的問題的答案不會解決問題。事實上,我已經對答案做了最好的猜測。我只是好奇聽到你對此的看法。這個C語句做了什麼?

這裏是C聲明我得到:

double(*foo(double(*)(double,double[]),double))(double, ...); 

我們的問題涉及描述foo的類型。我的問題僅僅是這個:這個陳述究竟做了什麼?就我所能讀的而言,這是我見過的代碼中最混亂和不切實際的代碼之一,或者它實際上並不是有效的C.讓我知道你的想法。

+3

東西太可怕了,這就是它所宣稱的。將它插入cdecl.org以獲得它的含義(你可能需要刪除`...`,因爲cdecl恨他們。 – birryree 2010-11-23 03:08:54

+5

你的教授顯然是個虐待者。 – ruslik 2010-11-23 03:13:13

+0

@ruslik,variadic是問題最少的部分:p – birryree 2010-11-23 03:14:15

回答

10

你想學的是Clockwise Spiral Rule。學習這將幫助你用簡單的語言描述C中的任何類型。好好學習。

0

這將有助於一點

typedef RETURNTYPE (* POINTER_TO_FUNCTION_TYPE)(ARGTYPE1, ARGTYPE2) 

C支持一個類型,它是一個函數指針,你可以的typedef一個這樣的方式來簡化此基礎上再表達。

所以,這種類型定義,我可以宣佈這個功能

POINTER_TO_FUNCTION_TYPE f(POINTER_TO_FUNCTION_TYPE g); 

這是一個函數,函數指針,並返回一個指向功能。沒有typedef,想象一下這個聲明的外觀。

0

根據我的編譯器(Visual Studio 2010)該聲明絕對沒有什麼。它編譯成功,但沒有爲其生成彙編指令,因此調試器會立即執行。至於爲什麼它什麼也不做,它的真正含義是什麼 - 它需要一個有更多C知識的人來解釋。

我可以使用順時針/螺旋法則計算foo的類型,但是 - 謝謝jer!如果你重新格式化它會更容易:

double 
(
    *foo 
    (
     double(*)(double, double[]), 
     double 
    ) 
) 
(double, ...);