我正在通过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/

10-13 06:29