是否可以将函数指针作为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
函数参数< /强>
答案 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限定类型