Dav*_*d X 6 c casting function-pointers
特别是,以下内容将无法按预期工作:
typedef void(*func_p)(void*);
void foo(int* data)
{
printf("%i\n",*data);
}
int main(int argc, char** argv)
{
func_p bar;
int x = 42;
bar = foo;
bar((void*)&x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我可以依靠的数据指针(void*,int*,struct baz*,但不neccesarily void(*)(void))总是被compatably通过呢?
标准不要求它有效.该标准要求char*,并void*具有相同的表示和对齐要求,所有结构指针这样做,所有的工会指针也这样做.虽然在任何情况下调用转换函数指针都是未定义的行为(§6.5.2.2p9),但相同的表示和对齐要求可以保证调用有效(§6.2.5p27).
其他指针类型不需要以这种方式表现,尽管我没有亲自遇到过这样的机器.从理论上讲,int*a 可能小于sizeofa char*(例如,如果int比对象要求更严格char,那么这可能是合理的事情).在正确的调用约定下,在这样的机器上,实际上不可能调用一个转换函数指针.