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)
你想要的语法是:
void execute(void (* const f)(void));
Run Code Online (Sandbox Code Playgroud)
这表示这f是一个const指向不带参数的函数的指针((void)是无参数的特殊语法)并且不返回任何内容 ( void)。constan 右侧的A*表示指针是const。const左侧的A表示指针指向的是const。
它是一个const指针这一事实意味着您不会f在函数中更改(分配新值),如果您这样做,编译器应该给您一个错误(除非更改被隐藏,它可以通过强制转换) . 它没有说明函数本身——指向的函数没有const任何意义,因为参数是const。
当你写道:
void execute(void (const * f)(void));
Run Code Online (Sandbox Code Playgroud)
在const上左侧*手段指针指着东西是const,而不是指针本身const。由于它说指针指向那里的某些东西而您没有列出特定类型,因此编译器警告您该类型丢失(并默认为int)。
关键字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”