如何在没有参数的情况下调用函数?

时间:2014-05-19 18:55:22

标签: c function function-pointers

我正在通过building my own Lisp学习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;
}

3 个答案:

答案 0 :(得分:5)

这一行

lenv_add_builtin(e, "def", builtin_def);

不会致电builtin_def。它在lenv_add_builtin的调用中用作指针(指向函数)。

答案 1 :(得分:2)

C语言指定函数调用操作符()后面没有的函数标识符计算函数的地址(又名函数指针)。

函数指针的典型用法是作为回调。标准示例是qsort函数的最后一个参数,它是任意比较函数的地址。

void qsort(void *base, size_t nmemb, size_t size,
     int (*compar)(const void *, const void *));

答案 2 :(得分:1)

它不是在调用函数;它传递一个函数(技术上,一个函数指针),可以用来调用该函数,此时将提供所需的参数。