函数指针作为常量参数

One*_*Arb 6 c arguments parameter-passing

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

我收到以下 gcc 错误:

警告:'f' [-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();
}
Run Code Online (Sandbox Code Playgroud)

这不是指向常量函数的指针什么意思的重复,它处理指向 const 函数的指针,而不是const函数参数

Eri*_*hil 6

你想要的语法是:

void execute(void (* const f)(void));
Run Code Online (Sandbox Code Playgroud)

这表示这f是一个const指向不带参数的函数的指针((void)是无参数的特殊语法)并且不返回任何内容 ( void)。constan 右侧的A*表示指针constconst左侧的A表示指针指向的const

它是一个const指针这一事实意味着您不会f在函数中更改(分配新值),如果您这样做,编译器应该给您一个错误(除非更改被隐藏,它可以通过强制转换) . 它没有说明函数本身——指向的函数没有const任何意义,因为参数是const

当你写道:

void execute(void (const * f)(void));
Run Code Online (Sandbox Code Playgroud)

const上左侧*手段指针指着东西是const,而不是指针本身const。由于它说指针指向那里的某些东西而您没有列出特定类型,因此编译器警告您该类型丢失(并默认为int)。


Ron*_*eau 0

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

void execute(void (* const f)(void))
{
  f();
}
Run Code Online (Sandbox Code Playgroud)

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

void execute(void (* const f)(void))
{
  f = print;
  f();
}
Run Code Online (Sandbox Code Playgroud)

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

错误:无法分配给具有 const 限定类型的变量“f”