c - 为什么我的 gcc 允许这个具有指针返回类型的空函数?
问题描述
以下函数hello 5
在 Debian 上运行的 gcc 8.3 上成功编译和打印:
#include <stdio.h>
int* bar(int* x) {}
int main() {
int x = 5;
int* p = bar(&x);
printf("hello %d\n", *p);
}
我对这个功能感到困惑bar
。它被声明为int*
但身体是空的,所以我实际上并没有告诉它返回任何东西。更令人担忧的是,为什么程序的行为就像我return x;
在正文中所说的那样bar
?这种行为是在某处指定的还是只是一个意外?
解决方案
C 标准不要求使用非 void 返回类型声明的函数返回值。
该标准规定,如果函数返回时没有返回值(因为执行流向其关闭}
)并且使用了函数的值,则未定义行为。但是,在某些情况下,函数在某些情况下返回值而不是其他情况下是有意义的。例如,您可以拥有一个根据命令参数设置或获取值的函数:
int AccessState(int Command, SomeStructure *S,...)
{
switch (Command)
{
case 0: // Get the state.
return S->Value;
case 1: // Set the state from the optional int parameter following S.
va_list ap;
va_start(ap, S);
S->Value = va_arg(S, int);
va_end(ap);
break;
}
}
这样做是不寻常的(并且可能不是好的设计),因此编译器可能会警告它。但是,为了符合 C 标准,C 实现不得拒绝控制可能到达关闭的非 void 函数}
。
推荐阅读
- json - 从结构创建 JSON,而不是结构值
- css - Typora:防止表格单元格自动换行
- angularjs - 发布 ASP.NET MVC 应用程序后无法正常工作
- node.js - 如何将令牌从 Nodejs 传递到后端 Java 代码
- reinforcement-learning - 如何为某个状态下唯一合法行为的行为设计奖励
- dart - 如何在 Flutter 中获取设备用户代理信息
- vue.js - 将对象数组动态添加到 Vue(反应性问题)
- java - 如何显示区域?
- python - 遍历python中的列表列表
- javascript - “AbortError:操作被中止。” - 在 Firefox 中调整 HTML 5 video.currentTime 时出错