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

标签 c function-pointers calling-convention

假设我有这个功能:

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/

相关文章:

C fread char 代码块

c++ - __cdecl 调用约定不适用于 msvc x64

c++ - 为什么++i 在性能方面永远不同于 i+=1

c - 函数调用中指向 const 的指针

c++ - 在 C++ 中调用指向成员函数的指针时出错

c++ - C++ 中使用不同的类作为方法的 'this' 调用存储在类中的方法的正确语法是什么?

c++ - 在 Visual Studio 中使用 __asm 返回 float 堆栈中的 double 值

assembly - x64 调用约定中前 4 个参数的影子空间的用途是什么

c - 使用 C 中的 DTD 验证 Xml 文件

c++ - 函数指针 - 2 个选项