关于函数指针声明

时间:2014-12-06 15:29:44

标签: c pointers function-pointers

#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);
}

在上面的代码中,函数指针的原型和函数定义不匹配。但代码仍然有效。请任何人帮我解决这个问题吗?

2 个答案:

答案 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的原型的情况下警告函数声明,尽管你也会得到误报:

http://coliru.stacked-crooked.com/a/e9eb7a7d2e384b00