azp*_*are 5 c pointers function-pointers
我不明白为什么以下代码会生成警告:
int func(double a, int b, char c)
{
return 0;
}
int main()
{
int(*myPointer)() = func;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为在C中,具有空参数列表的函数意味着可以接收未知数量的参数的函数.func4恰好接收3个参数.那为什么它与myPointer不兼容?
它特别令人困惑,因为以下编译时没有警告:
void boo()
{
return;
}
int main()
{
int(*pointerDude)(double) = boo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
这两种情况之间的区别可以这样解释:如果将参数传递给不接受任何参数的函数,那么您只是消耗了堆栈上的一些内存。如果您不将任何参数传递给接受一些参数的函数,则后者将从堆栈中读取随机数据。
更新:更改为社区 wiki 以添加 Pascal Cuoq 的以下更正:
尽管编译器会发出警告,但函数指针在两个方向上的转换都是合法的、信息丰富的警告。在这两种情况下,调用具有错误原型的函数都是非法的。某些 ABI 要求函数清理堆栈,在这种情况下,将参数传递给不接受任何参数的函数,就像不将参数传递给需要参数的函数一样,肯定会破坏堆栈。
C99 6.3.2.3 段 8:
指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应等于原始指针。如果转换后的指针用于调用类型与所指向类型不兼容的函数,则行为未定义