#include <stdio.h>
void func(int ,int);
void (*fp)();
int main()
{
fp = func;
fp(10,20);
}
void func(int a,int b)
{
printf("%d %d\n",a,b);
}
在上面的代码中,函数指针的原型和函数定义不匹配。但代码仍然有效。请任何人帮我解决这个问题吗?
答案 0 :(得分:4)
声明
void (*fp)();
说fp
是一个指向函数的指针,该函数接收未指定数量的参数,返回void
。因此它与void func(int a,int b) {...}
兼容。
声明为:
void (*fp)(void);
答案 1 :(得分:2)
void (*fp)(); // Pointer to function returning nothing, no argument info
void func(int ,int); // Function returning nothing with two intarguments
第14段解释指针是什么,下一段解释了它适合的原因。
6.7.6.3函数声明符(包括原型)
14标识符列表仅声明函数参数的标识符。一个空的 函数声明符中的列表是该函数定义的一部分,用于指定 功能没有参数。函数声明符中不属于a的空列表 该函数的定义指定没有关于数量或类型的信息 提供参数.145)
15要兼容两种功能类型,两者都应指定兼容的返回类型.146) 此外,参数类型列表(如果两者都存在)应在数量上一致 参数和省略号终止符的使用;相应的参数应具备 兼容类型。如果一个类型具有参数类型列表而另一个类型由a指定 函数声明符,它不是函数定义的一部分,并且包含空 标识符列表,参数列表不应具有省略号终止符和每个的类型 参数应与应用程序产生的类型兼容 默认参数促销。如果一个类型具有参数类型列表而另一个类型是 由包含(可能为空)标识符列表的函数定义指定,两者都应该 同意参数的数量,每个原型参数的类型应该是 与应用默认参数产生的类型兼容 促销到相应标识符的类型。 (在确定类型 兼容性和复合类型,每个参数都用函数或数组声明 type被视为具有调整类型,并且每个参数都使用限定类型声明 被视为具有其声明类型的非限定版本。)
同样令人感兴趣的是“未来语言方向”,因为它们表明它是向后兼容的功能。
6.11未来语言方向
6.11.6函数声明符
1使用带空括号的函数声明符(不是prototype-format参数 类型声明者)是一个过时的功能。
你可以要求GCC在没有使用-Wstrict-prototypes
的原型的情况下警告函数声明,尽管你也会得到误报: