|
按照 C 语言标准,我是这样写程序的: int main(void) { // Init initMethod(); / Main loop / while (1) { execute(); } // This return is never reached return 0; } 但是当代码用 SonarQube 做静态检测时,它报了一个错误'return' will never be executed。 为了修复这个问题,我打算改成这样: int main(void) { // Init initMethod(); / Main loop / while (1) { execute(); } } 但我又很纠结:main 函数不写返回值,感觉不符合规范。 这种情况下,正确的嵌入式编程规范到底是什么? |
强制类型转换不起作用
STM32 VSCode 扩展插件问题
在 CubeIDE 中为不同 RAM 区域定义带初始值的全局变量
FreeRTOS中为什么要以这种宏定义方式访问指定地址的值
编译器在结构体中插入了并不存在的 16 位变量?
第三方库尺寸评估
给变量赋值二进制数值无效
STM32CubeIDE 构建后运行脚本与路径中包含引号
int 与 float 之间的转换
有关STM32H743ZGT6 驱动RTL8201F-VB芯片驱动的问题,有奖寻求帮助
微信公众号
手机版
return 0; 这个返回值是返回给操作系统用来判断程序是否正常退出的,你可能没见过但是以后肯定能见到,有些程序突然闪退了,会在终端或者弹出一个窗口说退出码多少多少,这个退出码只要不是 0,就说明程序非正常退出,换句话说程序还没有执行到 return 0 就被操作系统杀掉了。
而 MCU,对于裸机而言,根本就没有操作系统,何谈返回值,就算返回了返回给谁呢?
而像 FreeRTOS 这种,这种操作系统和 Windows/macOS/Linux 这种操作系统又不一样了,Window/macOS/Linux 的内核都是在你用户的程序运行之前运行,也就是在所谓的 main 函数外部运行,初始化硬件以及准备软件运行环境。
对于 RTOS,以 FreeRTOS 举例,FreeRTOS 内核开始运行是在 main 函数内部,初始化硬件外设之后,调用 vTaskStartScheduler() 之后才开始运行,也就是说这个 FreeRTOS 的内核本身是在 main 函数内部的,那这个返回值返回给谁呢?
所以根本就没有这个必要返回,你写了反而多此一举。但是从语法上来说,函数已经声明了返回类型为 int,但是不返回任何值,编译器是会报警告或者错误的,这里应该厂商针对了编译器进行了优化。
忽略那个错误就是了
[md]针对于win,mac,linux系统,main()是应用程序。rtos来说main就是主函数了