C如何在没有参数的情况下调用函数?
我正在学习C语言,我很难理解下一行代码是如何工作的:C如何在没有参数的情况下调用函数?,c,function,function-pointers,C,Function,Function Pointers,我正在学习C语言,我很难理解下一行代码是如何工作的: lenv_add_builtin(e, "def", builtin_def); 我不明白的是:第三个参数如何调用没有参数的函数(lenv*,lval*)。我猜它们是作为typedef结构构建的,但我不确定。 这是完整的代码 // function pointer typedef lval*(*lbuiltin)(lenv*, lval*); lval* builtin_def(lenv* e, lval* a){ return
lenv_add_builtin(e, "def", builtin_def);
我不明白的是:第三个参数如何调用没有参数的函数(lenv*,lval*)
。我猜它们是作为typedef结构构建的,但我不确定。
这是完整的代码
// 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;
}
这条线
lenv_add_builtin(e, "def", builtin_def);
不调用builtin\u def
。在调用lenv\u add\u builtin
这一行时,它被用作(指向函数的)指针
lenv_add_builtin(e, "def", builtin_def);
不调用builtin\u def
。它在调用lenv\u add\u builtin
时用作(指向函数的)指针,但它没有调用函数;它正在传递一个可用于调用该函数的函数(从技术上讲,是函数指针),此时将提供所需的参数。它没有调用函数;它正在传递一个可用于调用该函数的函数(从技术上讲,是函数指针),此时将提供所需的参数。C语言指定函数标识符后面不跟函数调用操作符()
计算函数的地址(也称为函数指针)
函数指针的典型用途是用作回调。标准示例是qsort
函数的最后一个参数,它是任意比较函数的地址
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
C语言指定函数标识符不后跟函数调用操作符()
,其计算结果为函数的地址(也称为函数指针)
函数指针的典型用途是用作回调。标准示例是qsort
函数的最后一个参数,它是任意比较函数的地址
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
函数指针:函数没有被调用,只是被传递了。第三个参数不是函数调用;它是一个函数指针。指向的函数将稍后调用。lenv\u add\u builtin
将创建正确的两个参数。当调用和传递lenv\u add\u builtin
时,它只是函数的一个内存位置,这样传入并不意味着它立即被调用;它是一个函数指针。指向的函数将稍后调用。lenv\u add\u builtin
将创建正确的两个参数。当调用和传递lenv\u add\u builtin
时,它只是函数的一个内存位置,像这样传入并不意味着立即调用它。好的,我明白了,所以任何没有参数的函数都被用作指针(指向函数)?或者我应该这样声明lenv*(*builtin_def)(int,int)
以使其成为可能。或者正如@Jens在下面的回答中所说的,函数标识符后面没有()作为函数计算pointer@Pompeyo对你还得申报。否则,编译器将不知道变量的类型。Jens说的是真的。好吧,我明白了,所以任何没有参数的函数都被用作(指向函数的)指针?或者我应该这样声明lenv*(*builtin_def)(int,int)
以使其成为可能。或者正如@Jens在下面的回答中所说的,函数标识符后面没有()作为函数计算pointer@Pompeyo对你还得申报。否则,编译器将不知道变量的类型。延斯说的是真的。