函数指针没有参数类型?

时间:2013-12-30 07:52:27

标签: c pointers

我试图声明一个指向任何返回相同类型的函数的函数指针。我省略了指针声明中的参数类型,以查看将生成什么错误。但该程序编译成功并执行没有任何问题。

这是正确的声明吗?我们不应该指定参数类型吗?

#include <stdio.h>
#include <stdlib.h>

void add(int a, int b)
{
    printf("a + b = %d", a + b);
}

void (*pointer)() = &add;

int main()
{
    add(5, 5);
    return 0;
}

输出:

a + b = 10

3 个答案:

答案 0 :(得分:6)

类型名称中的空括号表示未指定的参数。请注意,这是一个过时的功能。

  

C11(ISO / IEC 9899:201x)§6.11.6函数声明符

     

使用带有空括号的函数声明符(不是prototype-format参数   类型声明者)是一个过时的功能。

答案 1 :(得分:5)

void (*pointer)()解释函数指向具有未指定数量的参数。它与void (*pointer)(void)不相似。所以后来你根据定义使用了两个成功拟合的参数。

答案 2 :(得分:0)

你应该知道几件事......

功能声明:

int myFunction();

功能原型:

int myFunction(int a, float b);
  • prototype是一种特殊的声明,用于描述函数参数的数量和类型。
  • non-prototype函数声明没有说明其参数。

示例:

int myFunction();

non-prototype函数声明并不意味着myFunction不带参数。这意味着myFunction采用了不确定数量的参数。编译器只是关闭参数类型检查,参数检查和转换myFunction

所以你可以做到,

int myFunction();   // The non-prototype signature will match a definition for
                    // myFunction with any parameter list.
// This is the function definition... 
int myFunction(int x, float b, double d)
{
    ...
}