假设我有这个功能:
int func2() {
printf("func2\n");
return 0;
}
现在我声明一个指针:
int (*fp)(double);
这应该指向一个函数,该函数需要double
参数并返回一个int
.
func2
没有任何论点,但当我写时仍然:
fp = func2;
fp(2);
(with 2
只是一个任意数字), func2` 被正确调用。
这是为什么?我为函数指针声明的参数数量没有意义吗?
是的,有一个意义。在 C 中(但是not在 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)