函数指针作为const参数

时间:2018-03-23 23:34:45

标签: c arguments parameter-passing

是否可以将函数指针作为const参数传递?

我收到以下gcc错误:

  

警告:在'f'的声明中输入默认为'int'   [-Wimplicit-int] void execute(void(const * f)(void));

...编译此代码时:

#include <stdio.h>

void print(void);
void execute(void (const *f)(void));

int main(void)
{
    execute(print); // sends address of print
    return 0;
}

void print(void)
{
    printf("const!");
}

void execute(void (const *f)(void)) // receive address of print
{
    f();
}

这不是 What is meaning of a pointer to a constant function? 的副本,它解决了指向const函数的指针而不是 const函数参数< /强>

2 个答案:

答案 0 :(得分:2)

您想要的语法是:

void execute(void (* const f)(void));

这表示f是指向函数的const指针,该函数接受void参数并且不返回任何内容(void)。 const右侧的*表示指针const。左侧的const表示指针指向const

它是const指针这一事实意味着您不会在函数中更改f(分配新值),如果您这样做,编译器应该给您一个错误。它没有说明函数本身 - 在任何意义上指向的函数都不是const因为参数是const

当你写道:

void execute(void (const * f)(void));

const左侧的*表示指针指向的是const,而不是指针本身是const。由于它说指针指向那里并且你没有列出特定类型,编译器警告你类型丢失(并且默认为int)。

答案 1 :(得分:0)

const关键字应放在指针符号(*)和参数名称(此处为f)之间:

void execute(void (* const f)(void))
{
  f();
}

现在,如果您尝试更改f的值:

void execute(void (* const f)(void))
{
  f = print;
  f();
}

...您的编译器应按预期输出类似于此错误的错误:

  

错误:无法分配给变量&#39; f&#39;使用const限定类型