C11:6.5.2.2 p9:
如果函数定义的类型与(的类型)不兼容 表达式)由表示被调用函数的表达式所指向,其行为是 未定义。
据我所知,函数调用表达式的行为取决于被调用函数的原型是否在调用时的范围内。
那么“被调用函数的表达式所指向的(表达式)类型”,被调用函数的表达式所指向的类型不就是函数类型,即函数声明吗?
坦白说,在我看来,标准的意图不就是“函数声明应该与定义兼容”吗? 并且,6.2.7 p2已经提到:
引用同一对象或函数的所有声明应具有兼容的类型; 否则,行为未定义。
那么这是否意味着6.5.2.2 p9是多余的?或者也许我的理解有问题? 感谢您的阅读和回答。
第 6.5.2.2 节处理函数调用,这是上面引用的上下文。
第 9 段特别涉及用于调用函数的表达式。 这可以是一个简单的声明或函数指针。 例如:
int foo(char *p)
{
// do something with p
return 1;
}
int main()
{
void (*fp)(void) = (void (*)(void))foo;
fp();
return 0;
}
根据 6.5.2.2p9,函数调用
fp
是未定义的行为,因为函数 foo
是通过不兼容的函数指针类型调用的。