我正在通过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;
}
答案 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)
它不是在调用函数;它传递一个函数(技术上,一个函数指针),可以用来调用该函数,此时将提供所需的参数。