如何在C中实现转换功能?

Ori*_*ski 6 c pointers casting function-pointers function

int foo(char *c)  {...}

main() {
     int (*thud)(void *);

     thud = (int (*)(void *))(foo);
}
Run Code Online (Sandbox Code Playgroud)

在评估作业时实际发生了什么?

铸造类型和foo; 之间存在差异; cast类型是一个指针,foo是一个函数.那么,编译器是否将' (foo)'中的内容转换为指针,foo然后才进行转换?因为没有别的东西似乎有意义; 另一个选项是函数本身被转换为一个指向函数指针,该函数获取void*并返回一个int,据我所知,函数是内存中一段代码的标签,因此不能成为指针,这是一个变量.

Ric*_*tty 5

在C中,绝对没有.它只是编译胶水,以防止你做一些愚蠢的事情.在C中,调用者负责维护堆栈帧,因此在调用函数时需要强制转换(即参数和返回值被压入堆栈).这使得它安全(r),因为调用者的堆栈不可能不正确地变异.但是,在某些极少数情况下,调用的函数仍然可能会扰乱调用者的堆栈.

我应该澄清一下,赋值复制了函数指针.但在C语言中,所有函数指针都只是指针.类型和转换都是编译器粘合剂.

另一个澄清:标准指定(在6.5.2.2中)如果调用者使用不兼容的类型,则行为是未定义的.例如,将一个返回void的函数转换为一个返回int然后调用该函数的函数,"返回"值是没有意义的.在调用函数之前将函数转换为兼容类型是个好主意,否则您可能会看到意外的结果.


eph*_*ent 5

当这样使用时,函数的名称是指针.它有点类似于数组名称是指向其第一个元素的指针.

话虽这么说,通过一个与函数的实际原型不同的类型的指针调用函数(如您的示例所示)是未定义的行为.不要这样做.

附录

如果转换的指针用于调用类型与指向类型不兼容的函数,则行为未定义.

来自C标准的第6.3.2.3节.