假设我有这个功能:
int func2() {
printf("func2\n");
return 0;
}
现在我声明一个指针:
int (*fp)(double);
这应该指向一个接受 double
参数并返回 int
的函数。
func2
没有任何参数,但是当我写的时候:
fp = func2;
fp(2);
(2
只是一个任意数字),func2` 被正确调用。
这是为什么呢?我为函数指针声明的参数个数没有意义吗?
最佳答案
是的,有一个意思。在 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;
关于c - 为什么我可以通过带有太多参数的指针来调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140045/