为什么我可以通过带有太多参数的指针调用函数?

时间:2011-08-21 18:01:34

标签: c function-pointers calling-convention

说我有这个功能:

int func2() {
    printf("func2\n");
    return 0;
}

现在我宣布一个指针:

int (*fp)(double);

这应该指向一个带有double参数并返回int的函数。

func2没有任何争论,但仍然写作:

fp = func2;
fp(2);

2只是一个任意数字),func2`被正确调用。

为什么?我为函数指针声明的参数数没有意义吗?

2 个答案:

答案 0 :(得分:46)

是的,有意义。在C(但不是在C ++中)中,使用一组空括号声明的函数意味着它需要一个未指定的参数。执行此操作时,您将阻止编译器检查参数的数量和类型;它是C语言被ANSI和ISO标准化之前的延续。

未能使用正确数量和类型的参数调用函数会导致未定义的行为。如果您通过使用void的参数列表显式声明函数采用零参数,那么当您分配错误类型的函数指针时,编译器会给出警告:

int func1();  // declare function taking unspecified parameters
int func2(void);  // declare function taking zero parameters
...
// No warning, since parameters are potentially compatible; calling will lead
// to undefined behavior
int (*fp1)(double) = func1;
...
// warning: assignment from incompatible pointer type
int (*fp2)(double) = func2;

答案 1 :(得分:-4)

您需要显式声明参数,否则您将获得未定义的行为:)

int func2(double x)
{
    printf("func2(%lf)\n", x);
    return 0;
}