我正在通过building my own Lisp学习C,我很难弄清楚,如果我的函数指针builtin_def
没有声明,编译器为什么不抱怨呢?,编译器如何知道作为参数传递的变量的类型?
// 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); // builtin_def not declared
}
int main(int argc, char** argv){
lenv* e = lenv_new(); // constructor
lenv_add_builtins(e)
return 0;
}
注意,我没有像这样的
builtin_def
声明:lenv*(*builtin_def)(lenv*, lval*);
最佳答案
您在上面声明builtin_def
几行。然后自动转换为函数指针:(C99第6.3.2.1节)
函数指示符是具有函数类型的表达式。除非是sizeof
运算符、_Alignof
运算符或一元&
运算符的操作数,a
类型为“函数返回类型”的函数指示符转换为
具有类型“”指向返回类型“”的函数的指针。
所以一切正常。
关于c - 编译器如何知道函数指针的变量类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23753611/