【问题标题】:Function pointer as a const argument函数指针作为 const 参数
【发布时间】:2018-09-02 17:15:36
【问题描述】:
是否可以将函数指针作为 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 函数参数。
【问题讨论】:
标签:
c
arguments
parameter-passing
【解决方案1】:
你想要的语法是:
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)。
【解决方案2】:
const 关键字应放在指针符号 (*) 和参数名称(此处为 f)之间:
void execute(void (* const f)(void))
{
f();
}
现在,如果您尝试更改 f 的值:
void execute(void (* const f)(void))
{
f = print;
f();
}
...您的编译器应该会按预期输出与此类似的错误:
错误:无法分配给具有 const 限定类型的变量“f”