网站模板html5,高校后勤网站建设,网站推广 软件,大学生免费服务器编写不易#xff0c;禁止搬运#xff0c;仅供学习#xff0c;感谢理解
问题现象 下面是一个在keil5里面写的一个#xff0c;int类型的返回值函数#xff0c;这个函数里面#xff0c;只有if else if else这三个判断条件语句#xff0c;正常来说任何情况下#xff0c;… 编写不易禁止搬运仅供学习感谢理解
问题现象 下面是一个在keil5里面写的一个int类型的返回值函数这个函数里面只有if else if else这三个判断条件语句正常来说任何情况下函数执行只会执行函数中的其中一个的判断语句条件不论执行的是哪一个判断语句条件这个时候都会有函数返回值函数如下。
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不影响烧录程序当时为了弄明白是怎么回事就开始研究了。
..\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 就可以了。 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 让编译器不会报错
} 欢迎指正希望对你有所帮助