C语言中函数指针带&与不带&引用:是否有风格选择依据?
在C语言中使用函数指针时,加
&和不加&的风格选择理由 从语法层面来说,这两种写法完全等价:C标准规定,函数名在表达式中会隐式转换为指向该函数的指针,所以直接写函数名cb1和显式取地址&cb2的效果没有任何区别,编译器都会将其解析为函数指针,就像你提供的代码在gcc环境下编译运行无警告一样:
#include <stdio.h> int cb1(void) { return 1; } int cb2(void) { return 2; } void do_cb(int (*cb)(void)) { printf("%d\n", cb()); } int main(void) { do_cb(cb1); do_cb(&cb2); }
风格层面的选择主要看团队习惯和可读性需求,两种写法各有侧重:
倾向于不加&的理由
- 更简洁紧凑,符合C语言追求简洁表达的传统风格,很多经典C代码(比如Linux内核源码)都采用这种写法
- 函数名转指针是C的默认行为,写起来更符合语言的“原生感”,对熟悉C规则的开发者来说更自然
倾向于加&的理由
- 显式清晰,能让读者(尤其是新手)一眼明确这里是在取函数的地址,避免疑惑“为什么直接传函数名就能当指针用”
- 和普通变量取地址的写法
&var保持一致,语法上更统一,降低认知负担 - 在复杂代码场景中,显式的
&能更突出“传递指针”的意图,避免和其他语法特性混淆
总之,两种写法都合法且等价,没有绝对的优劣,关键是在团队或项目中保持风格统一,遵循既定的编码规范即可。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

