gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:25:08 25 4
gpt4 key购买 nike

假设我有这个功能:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com