【问题标题】:Function pointer without arguments types?没有参数类型的函数指针?
【发布时间】:2014-01-17 02:27:11
【问题描述】:

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

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

#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

【问题讨论】:

  • 这是完全合法的 K&R C。
  • 示例代码作为示例没有意义。
  • @BLUEPIXY 为什么会这样?
  • 指针未用于除此之外的赋值。不知道就算不使用无效指针也不行吧?这不是至少获得正确输出的原因。

标签: c pointers


【解决方案1】:

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

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

使用带空括号的函数声明符(不是原型格式参数 type declarators) 是一个过时的特性。

【讨论】:

  • 声明符是什么意思?
  • @rullof 关于声明的事情(与定义相反),我真的不知道如何准确地解释它。
【解决方案2】:

void (*pointer)() 解释指向的函数有未指定数量的参数。它与void (*pointer)(void) 不同。因此,稍后当您使用两个根据定义成功拟合的参数时。

【讨论】:

    【解决方案3】:

    这里有几件事你应该知道...

    函数声明:

    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)
    {
        ...
    }
    

    【讨论】:

    • float 升级后变为double。如果您使用非完全提升的参数类型,则不能使用非原型声明。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多