2014-05-19 179 views
1

我被building my own Lisp學習C和我有麻煩搞清楚的下一行代碼是如何工作的:C如何在不帶參數的情況下調用函數?

lenv_add_builtin(e, "def", builtin_def); 

我不明白的是:如何在第三個參數調用一個函數不帶參數(lenv*, lval*) 。我的猜測是他們被修建爲typedef structs,但我不確定。 這裏是整個代碼

// function pointer 
typedef lval*(*lbuiltin)(lenv*, lval*); 

lval* builtin_def(lenv* e, lval* a){ 
    return lval_sexpr(); 
} 

void lenv_add_builtins(lenv* e){ 
    lenv_add_builtin(e, "def", builtin_def); // ??? 
} 

int main(int argc, char** argv){ 
    lenv* e = lenv_new(); // constructor 
    lenv_add_builtins(e) 
    return 0; 
} 
+1

函數指針:該函數沒有被調用,但剛剛通過。 – nneonneo

+0

第三個參數不是函數調用;它是一個函數指針。指向的函數將在稍後調用。 –

+0

'lenv_add_builtin'會創建適當的兩個參數。當'lenv_add_builtin'被調用並且將'builtin_def'只傳遞給函數的內存位置時,傳入它就不會立即調用它。 –

回答

5

此行

lenv_add_builtin(e, "def", builtin_def); 

不叫builtin_def。在調用lenv_add_builtin時,它用作指針(指向函數)。

+0

好吧,我看到了,所以沒有參數的任何函數都被用作指針(函數)?或者我應該聲明它像'lenv *(* builtin_def)(int,int)'使它成爲可能。 或者@Jens在下面的答案中說,函數標識符()不會跟在()後面評估爲函數指針 – Pompeyo

+1

@Pompeyo,是的。你仍然必須申報。否則,編譯器將不知道變量的類型。延斯說的是真的。 –

1

它不調用函數;它傳遞一個函數(技術上,一個函數指針),可以使用該函數調用該函數,此時將提供所需的參數。

2

C語言規定函數調用運算符()後面沒有的函數標識符評估爲函數的地址(又名函數指針)。

函數指針的典型用途是用作回調函數。標準示例是qsort函數的最後一個參數,它是任意比較函數的地址。

void qsort(void *base, size_t nmemb, size_t size, 
    int (*compar)(const void *, const void *)); 
相關問題