源代码示例为:
int add2(int a0, int a1)
{
return a0+a1;
}
int add4(int a0, int a1, int a2, int a3)
{
return a0+a1+a2+a3;
}
int (*fptr)(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7);
int main()
{
volatile int ret0;
int a0=0;
int a1=1;
int a2=2;
int a3=3;
int a4=4;
int a5=5;
int a6=6;
int a7=7;
fptr = add4;
ret0=fptr(a0,a1,a2,a3,a4,a5,a6,a7);
return ret0;
}
在此示例中,我们具有带有8个参数的函数指针。 我正在为该指针分配包含4个参数的函数的指针。 在这种情况下,编译器可能会生成汇编代码,该汇编代码将使用目标函数中未使用的堆栈和寄存器(带有4个参数)。 分配和使用参数少于函数指针的函数地址是否合法? 使用这样的编程模式安全吗?
答案 0 :(得分:3)
分配有效:
fptr = add4;
C17 :: 6.3.2.3 :: 8:
指向一种类型的函数的指针可以转换为指向 另一种功能并再次返回;结果应进行比较 等于原始指针。如果使用转换后的指针来调用 一个类型与所引用类型不兼容的函数, 行为是不确定的。
但是,仅将其存储为其他函数指针是有效的,而不能使用它(实际上是调用函数):
ret0 = fptr(a0, a1, a2, a3, a4, a5, a6, a7);
C17 :: 6.5.2.2 :: Constraints.2:
如果表示被调用函数的表达式的类型为 包括原型,论据的数量应与 参数数量。每个参数的类型应使其 值可以分配给具有非限定版本的对象 相应参数的类型。
答案 1 :(得分:2)
分配和使用参数少于函数指针的函数地址合法吗?
否,函数指针应具有与基础函数相同的参数类型和数量。
参考http://port70.net/~nsz/c/c99/n1256.html#6.5.16.1
以下约束适用于简单分配