c - 函数引用参数:指针与原型只是样式?
问题描述
您可以声明一个函数引用参数是纯粹的风格吗,例如,
int g ( int (*f)(int,int) ) {
或者
int g ( int f(int,int) ) {
在我有限的 C 语言经验中,我从未见过原型方法。
解决方案
我想这是风格,但是指向函数符号的显式指针与古代实践以及编译器解释代码的方式一致。
C11*
标准在§6.7.6.3 函数声明符(包括原型)¶8中说:
¶8 将参数声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如 6.3.2.1 中所示。
§6.3.2.1左值、数组和函数指示符¶4说:
¶4 函数指示符是具有函数类型的表达式。除非它是运算符的操作数,
sizeof
运算_Alignof
符65)或一元运算&
符,类型为“函数返回类型”的函数指示符被转换为类型为“指向函数返回类型的指针”的表达式。65)因为没有发生这种转换,所以
sizeof
or_Alignof
运算符的操作数仍然是一个函数指示符,并且违反了 6.5.3.4 中的约束。
因此,使用指针表示法明确地显示了编译器无论如何都会做什么。(我仍然通常使用该符号调用指向函数的显式指针(*function_ptr)(arg1, …, argN)
,尽管它function_ptr(arg1, …, argN)
也可以。)
*
C18 标准是最新的,但目前还没有方便的在线 HTML 版本。大多数情况下,两者非常相似。碰巧的是,§6.3.2.1 ¶4 是有区别的一段——C18 版本没有提到_Alignof
.
推荐阅读
- python - 如何在 Pandas / Python 中将 (x, y, k) 转换为以 x 为行、y 为列的 k 矩阵?
- css - flex shrink 0 导致滚动条消失,它忽略了火狐边缘中的溢出自动,即,但在 chrome 中却没有,为什么
- python - 无法弄清楚如何正确输出我的数据
- c++ - 无法确定 Opengl 绘图的平面方向
- c# - 如何在 OwinMiddleware 和 .Net MVC 5 中使用 IOwinContext 删除 cookie?
- apache-spark - 如何将深度学习模型数据传递给 Spark 中的映射函数
- python - 我正在做这个初学者项目,但我遇到了错误
- django - 使用调用外部 API 的自定义保存方法测试 Django 模型
- sas - SAS - 跨行复制多个观察结果
- adyen - Adyen - 动态创建 HPP 皮肤