工作bug,keil5编译器,理解int 类型函数返回值问题,详解!!!

编写不易,禁止搬运,仅供学习,感谢理解

问题现象

下面是一个在keil5里面写的一个,int类型的返回值函数,这个函数里面,只有if else if else这三个判断条件语句,正常来说任何情况下,函数执行只会执行函数中的其中一个的判断语句条件,不论执行的是哪一个判断语句条件,这个时候都会有函数返回值,函数如下。

cpp 复制代码
int Scanf_Bit_IO_Function(void)
{
	
	GLED_Open();
	if(!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)&&!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
	{
		GLED_Close();
		YLED_Open();
		LL_mDelay(200);
		Beer_Start();
		if(LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)||LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
		{
			//这个时候短接过后有不断接了,停掉黄灯
			YLED_Close();
			return 0;//执行到return 就会结束函数当前调用,因为在while里面就会再次进行调用
		
		}
	
	}
	else if(!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_3)&&!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_6))
	{
		GLED_Close();
		YLED_Open();
		LL_mDelay(200);
		Beer_Start();
		if(LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)||LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
		{		
			
			//这个时候短接过后有不断接了,停掉黄灯
			YLED_Close();
			return 0;//执行到return 就会结束函数当前调用,因为在while里面就会再次进行调用	
		}
	}
	else
	{
		return 1;//这个时候代表没有检测到下拉
	}

}

当时在实际编译的过程中,keil5编译器是有一条warning的,虽然warning不影响烧录程序,当时为了弄明白是怎么回事,就开始研究了。

cpp 复制代码
..\driver\gpio.c(168): warning:  #940-D: missing return statement at end of non-void function "Scanf_Bit_IO_Function" 
  }
..\driver\gpio.c: 1 warning, 0 errors

这里的话,这个警告提示我们,这个函数少了一个返回值,当时按照函数逻辑来讲,函数在任何情况下,是不会少返回值的。

问题本质理解

这个时候需要占在keil5编译器的角度去理解问题,keil5在检查代码的时候,通常只进行静态分析,不会运行代码,他不会尝试所有可以运行的代码路径,在代码里面虽然,if-else if-else包含了所有的可能行,但是编译器不能推断。

在keil5编译器的角度里面,当if else if的条件为false的时候,同时跳出else这种情况,虽然我们知道这种情况是不可能发生的。

但是编译器不这么认为,他认为如果发生这种情况仍然,会返回位置的数值。

如何解决问题

上面已经描述了,出现问题的情况,所以这里只需要把,编译器认为会出现没有返回值的情况,在加上return 1 ; 就可以了。

cpp 复制代码
int Scanf_Bit_IO_Function(void)
{
	
	GLED_Open();
	if(!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)&&!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
	{
		GLED_Close();
		YLED_Open();
		LL_mDelay(200);
		Beer_Start();
		if(LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)||LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
		{
			//这个时候短接过后有不断接了,停掉黄灯
			YLED_Close();
			return 0;//执行到return 就会结束函数当前调用,因为在while里面就会再次进行调用
		
		}
	
	}
	else if(!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_3)&&!LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_6))
	{
		GLED_Close();
		YLED_Open();
		LL_mDelay(200);
		Beer_Start();
		if(LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_2)||LL_GPIO_IsInputPinSet(Scanf_Port, Set_Pin_1))
		{		
			
			//这个时候短接过后有不断接了,停掉黄灯
			YLED_Close();
			return 0;//执行到return 就会结束函数当前调用,因为在while里面就会再次进行调用	
		}
	}
	else
	{
		return 1;//这个时候代表没有检测到下拉
	}
    return 1;//加上return 让编译器不会报错
}

欢迎指正,希望对你,有所帮助!!!

相关推荐
多弗朗皮卡丘3 小时前
C语言梦开始的地方3
c语言·开发语言
天空'之城13 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
stevenseahang21 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·可移植性·标准演化·ansic
别动我齐刘海1 天前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
AI科技星1 天前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
坏柠1 天前
C语言进阶:从零实现一个可靠的环形缓冲区,吃透回绕、边界与并发
java·c语言·算法
choumin1 天前
C程序能调用extern “C“声明的带默认参数的C++函数吗?
c语言·c++·extern c·默认参数
LONGZETECH1 天前
传统实训 vs 仿真实训:从技术架构拆解新能源汽车教学的范式之变
c语言·3d·unity·架构·汽车
白白白小纯1 天前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
Aurorar0rua1 天前
CS50 x 2024 Notes Algorithms - 08
c语言·开发语言·算法·学习方法