函数指针定义中是否允许参数名?合法性求证
确认带命名参数的函数指针声明是标准C合法写法
嘿,你完全不用怀疑——这个写法是标准C明确允许的,并非GCC专属扩展!
核心依据:C标准对函数指针参数列表的规定
在C标准(比如C99、C11及之后的版本)里,函数指针的参数列表规则和普通函数声明是一致的:
函数指针的参数类型列表中,既可以只指定参数类型,也可以同时为参数添加标识符(也就是你看到的命名参数)。
具体来说,参考C11标准的6.7.6.3节第7条:
参数类型列表可以指定参数的类型,也可以为参数声明标识符。
这意味着int (*func)(int a, int b)这种写法,和更常见的int (*func)(int, int)完全等价——参数名a和b只是可选的标识符,编译器会忽略它们的实际名称,只关注参数类型。
补充说明:关于&foo的写法
顺带提一句,=&foo的写法也是标准合法的:函数名foo会隐式转换为指向该函数的指针,所以func = foo和func = &foo效果完全一样,两种写法都被标准允许。
为什么这种写法少见?
正如你所说,函数指针本身的语法已经足够绕,再加上参数名确实会增加视觉复杂度,而且这些参数名对编译器没有实际作用(只是给阅读代码的人做提示),所以日常代码里很少有人这么写,但这绝对不是语法错误。
内容的提问来源于stack exchange,提问作者Jonathan Mee
相关产品推荐
相关产品推荐

