首页 > 解决方案 > 函数引用参数:指针与原型只是样式?

问题描述

您可以声明一个函数引用参数是纯粹的风格吗,例如,

int g ( int (*f)(int,int) ) {

或者

int g ( int f(int,int) ) {

在我有限的 C 语言经验中,我从未见过原型方法。

标签: cparametersreferenceprototype

解决方案


我想这是风格,但是指向函数符号的显式指针与古代实践以及编译器解释代码的方式一致。

C11*标准在§6.7.6.3 函数声明符(包括原型)¶8中说:

¶8 将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如 6.3.2.1 中所示。

§6.3.2.1左值、数组和函数指示符¶4说:

¶4 函数指示符是具有函数类型的表达式。除非它是运算符的操作数,sizeof运算_Alignof65)或一元运算&符,类型为“函数返回类型”的函数指示符被转换为类型为“指向函数返回类型的指针”的表达式。

65)因为没有发生这种转换,所以sizeofor_Alignof运算符的操作数仍然是一个函数指示符,并且违反了 6.5.3.4 中的约束。

因此,使用指针表示法明确地显示了编译器无论如何都会做什么。(我仍然通常使用该符号调用指向函数的显式指针(*function_ptr)(arg1, …, argN),尽管它function_ptr(arg1, …, argN)也可以。)


*C18 标准是最新的,但目前还没有方便的在线 HTML 版本。大多数情况下,两者非常相似。碰巧的是,§6.3.2.1 ¶4 是有区别的一段——C18 版本没有提到_Alignof.


推荐阅读