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)。繰り返しますが、これは予想されます。
ただし、割り当てられた関数には0ではなく2つのパラメーターが必要ですが、次のコードは警告なしでコンパイルされます(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;
}
鋳造はどこにも含まれていません。
誰かがこのコンパイラの動作を説明できますか?