嵌入式开发过程中躺过的那些坑
弗兰克发福
不破坏,不失信,不汲汲而求,不放弃。
展开
-
对变量“喜新厌旧”的编译器
【代码】对变量“喜新厌旧”的编译器。原创 2023-06-19 20:26:53 · 126 阅读 · 0 评论 -
#define可能是个“渣男”
structfoo这样,编程者只需在程序中改动一行代码,即可改变a、b、c的类型,而与a、b、c在程序中的什么地方声明无关。宏定义的这种用法有一个优点——可移植性,得到了所有C编译器的支持。这个语句定义了 FOOTYPE 为一个新的类型,struct foo完全等效。单纯看这个使用似乎与宏定义的使用没有太大区别,但是更多的时候,使用宏定义类型,真的很不靠谱!structfoo*从上面两个定义来看,T1和T2从概念上完全符同,都是指向结构foo的指针。T1 a , b;T2 a , b。原创 2022-11-06 22:12:25 · 298 阅读 · 0 评论 -
“悬挂式条件”引发的“血案”
这个问题虽然已经为人熟知,而且也并非c语言所独有,但即使是有多年经验的c程序员也常常在此失误过。估计稍微一点经验的编程者都理解这个理论基础,但很多时候却”防不胜防“,因为出现这种出乎意料的。,然而,这段代码实际上所做的却与编程者的意图相去甚远。原因在于C语言中有这样的规则,)时引入的,静悄悄而又隐蔽的出现,而造成的后果往往是崩溃性的。写法并非编程者开始设计的模样,往往是通过代码整合(这段代码中编程者的本意是应该有两种主要情况,源码管理时代码合并、解决冲突等。原创 2022-11-06 22:09:51 · 272 阅读 · 1 评论 -
失控的返回值
这个程序包含一个不易察觉的错误。C语言函数有个特点——一个返回值为整型的函数如果返回失败,实际上是隐含地返回了某个“垃圾”整数(如果非要深究,这个时候会返回处理器第一个运算寄存器的值,而这个值是什么取决于当前处理器的运算状态)。只要该数值不被用到,就无关紧要。在编译器中可以强制加上强制返回检查,当编程者在函数实现时遗漏了编译器会报错误或警告,因此上面第一个编译时,在新版本的会产生一个警告,养成一个好的习惯,所有的函数返回,不管是与否,都需要显式编写(包括与。原创 2022-11-06 22:05:03 · 471 阅读 · 0 评论 -
换马甲的数组
所以,C语言中会自动地将作为参数的数组声明转换为相应的指针声明。声明了 hello 是一个字符数组。如果将该数组作为参数传递给一个函数,是一个字符的二维数组。编程者可以任选一种写法来。是一个字符串数组,而下面那种写法,更强调的是。数据的这种多样性定义,被某些编程者称为。,容易造成混淆错觉,却又没有什么意义。如果我们使用数组名作为参数,那么。因此,将数组作为函数参数毫无意义。,这或许就是这个语言设计的初衷。上面一种写法,更加强调。与这种写法也完全相同。原创 2022-11-06 22:01:27 · 438 阅读 · 0 评论 -
注意分号 ; 的在语法节奏感
一位资深的编程者说,每个编程人员在编码的时候都会有一种抑扬顿挫的表达节奏,练成这种感觉以后,代码中出现以上这种异常的分号,会显得特别碍眼,那大家好好感受下这种节奏吧。在C语言中的作用是作为一条语句结束的标识,在C程序中如果不小心多写了一个分号可能不会造成什么不良后果,这个分号也许会被视作一个不会产生任何实际效果的空语句。由此可见当程序中出现多余的分号时,会隐藏不易被发现的错误。语句没有任何关系了,也就是在任何情况下b的值都会赋给。语句后多了一个分号,后面的语句。写法的问题,下面会描述)。原创 2022-11-06 22:00:16 · 383 阅读 · 0 评论 -
一个神奇的整型常量
当然,有一种情况需要注意的,在书写代码时候,为了上下文美观需要,忽略这个“神奇的整型常量”的编程者可能无意中把十进制写成了八进制,”好心却做了坏事“。了解进制含义都知道这个数在八进制与十进制上截然不同。在很多公司编程规范里,命令禁止使用八进制常量,有类似需求的使用十六进制代替。C 语言中,有一个神奇的整型常量语法定义——,而非数理逻辑里的十进制。010等于10(十)原创 2022-11-06 21:58:44 · 70 阅读 · 0 评论 -
‘==‘与‘=‘并非胖与瘦一样容易分辨
同时出现(与三元表达式 c=a==b?1:2),并产生复杂的嵌套。,然后检查该值是否为零,但实际上有可能事与愿违,造成比较大的恶果。由于这样的特殊性,在一个表达式中可以出现多个。针对该陷阱,可以养成以下两个良好的习惯客服。等,用于相等比较的时候,使用。,而用于赋值的时候使用。原创 2022-11-06 21:54:08 · 205 阅读 · 0 评论 -
select() 的 timeout 陷阱
在调用 select() 的 timeout 会倾向于在循环外部进行赋值,以降低不必要的 CPU 消耗,关于 select() timeout 上的用法陷阱,很多资深的平台移植人员也掉进过,在 FreeRTOS 平台调用 select,timeout 的值在调用前后保持不变,但任何的处理都是要花费时间的,当 select() 第一次调用完成再次进入循环体时,这个 timeout 的值已经背更新为”剩下的时间“,如 9 秒,这个时候,select() 调用的设计不再符合设计者的初衷,原创 2022-11-06 15:17:20 · 2034 阅读 · 0 评论