在 Visual Studio 2012 中的函数指针问题之后,我开始怀疑 C 中对函数指针的某些赋值的合法性。
下面的代码编译时会出现警告,正如我所期望的那样,因为分配的函数需要的参数比函数指针声明所描述的参数多(GCC 4.8):
#include <stdio.h>
int test(int x, int y)
{
printf("%d", x);
printf("%d", y);
return 0;
}
int main()
{
int (*test_ptr)(int);
test_ptr = test;
test_ptr(1);
return 0;
}
如果更改代码以使分配的函数需要更少的参数(GCC 4.8),则会出现相同的警告。同样,这是意料之中的。
但是,尽管分配的函数需要 2 个参数而不是 0 ( GCC 4.8 ),但以下代码编译时没有任何警告:
#include <stdio.h>
int test(int x, int y)
{
printf("%d", x);
printf("%d", y);
return 0;
}
int main()
{
int (*test_ptr)();
test_ptr = test;
test_ptr();
return 0;
}
任何地方都不涉及铸件。
谁能解释这个编译器行为?