能否将函数指针作为const参数传递?编译遇GCC警告问题
函数指针作为const参数传递的问题解析
咱们先解决你碰到的GCC警告问题,再聊核心疑问:
为什么会出现「type defaults to 'int'」警告?
你代码里的函数声明void execute(void (const *f)(void))写法有误。在C语言中,不能用const直接修饰函数本身(这是C++成员函数的特性,C里不存在const函数的概念)。编译器无法正确解析这个错误的声明,就默认把f当成了int类型,于是抛出了这个警告。
函数指针能不能作为const参数传递?
当然可以!但你得用对const的位置——要修饰的是函数指针本身,而不是函数。正确的写法是把const放在*的后面,用来表示这个指针的指向不可修改。
举个例子,如果你想让execute函数里的参数指针f不能被重新赋值,正确的声明和定义应该是:
void execute(void (*const f)(void));
这里的(*const f)表示f是一个指向无参数无返回值函数的const指针,和普通指针的int *const ptr逻辑完全一致——指针本身不可变,但指向的内容(这里是函数)可以正常调用。
修正后的完整代码
#include <stdio.h> void print(void); // 正确声明const函数指针参数 void execute(void (*const f)(void)); int main(void) { execute(print); // 传递print函数的地址,完全合法 return 0; } void print(void) { printf("const!"); } void execute(void (*const f)(void)) { f(); // 正常调用函数 // 如果你尝试写 f = some_other_func; 编译器会报错,因为f是const指针 }
额外区分两种容易混淆的写法
void (*const f)(void):f是const指针,不能改变f的指向void (*f)(const void):f是指向「参数为const void类型」的函数的指针,这里的const修饰的是函数的参数,和前者完全不是一回事
内容的提问来源于stack exchange,提问作者OneArb
相关产品推荐
相关产品推荐

