文章图片
嵌入式系统开发人员应尽可能明确 , 以避免ASSUME综合症并在其系统中产生意外行为 。 在今天的文章中 , 让我们来看看嵌入式开发人员可以通过更明确的方式清理代码的几个领域 。
显式编程技巧#1 – 将extern 与公共函数一起使用
我们都知道我们不应该使用extern , 因为它会创建全局变量 , 进而可能导致各种问题 。 但是 , 实际使用extern 的一个好地方是在创建公共函数时 。
当你定义一个公开的函数时 , 你可以使用以下命令在标头中创建声明或原型:
voidFoo(void);
它在标题中 , 所以很明显它是一个公共的外部函数 。 但是 , 我遇到过这样的情况 , 你正在维护一个别人编写的模块 , 并且在像Bar 这样的函数的标头中没有公共API , 但它的定义如下:
voidBar(void)
{
…
这个函数的目的是什么?它应该是私有的并且前面有一个静电吗?它应该是公开的并在标题中定义吗?如果嵌入式开发人员将Bar 定义为:
externBar(void)
{
…
我们会知道它是公开的并且在API 中缺失 , 尽管有人调用它 , 链接器仍然能够找到它 。
显式编程技巧#2 – 将指针作为const 传递给函数 , 除非它们改变
指针是危险的 , 如果它们在执行过程中意外地以某种意想不到的方式递增、递减或修改 , 它们很容易导致灾难 。 我经常会遇到如下所示的函数声明:
voidFoo(uint32_t * Param1);
这个声明是如此含蓄 , 我读了这个声明 , 其目的是将一个指针传递给一个uint32_t , 其中指针和指向的uint32_t 内存位置都允许更改!
这是嵌入式开发人员的本意吗?如果他们只是想传递一个指向变量的指针 , 以便它通过引用传递并且可以被函数修改怎么办?这个函数可以做到这一点 , 但他们也打开了修改指针的选项!
下面的陈述对我来说非常清楚 , 指针不会改变 , 指向的值可以改变:
voidFoo(uint32_t * const Param1);
参数是指向uint32_t 内存位置的const指针 。 指针在函数中不能改变 , 但指向的东西可以 。 因此 , 如果有人在函数中执行以下操作:
Param++;
编译器会说“不!错误!” , 让维护者明白他们不应该这样做 。
显式编程技巧#3 – 将“noreference”变量作为const 传递
现在 , 这通常会让嵌入式开发人员兴奋不已 , 而且不是很好 。 有人告诉我这是无稽之谈 , 但同样 , 它使包括新手在内的任何开发人员都清楚代码 。
这里的想法是我可能有一个声明如下的函数:
voidFoo(uint32_t Param1);
在这种情况下 , 我通过副本而不是引用传递参数 , 以供函数使用 。 该函数理论上可以对本地副本执行任何操作 。 但同样 , 如果有人在维护这段代码 , 他们是否知道我们想要接收参数并将其用作常量?对我来说 , 除非声明是这样写的 , 否则我不会有任何线索:
voidFoo(const uint32_t Param1);
这告诉我 , 该参数预计不会在副本中更改或修改以供本地使用 。
【阿尔法|嵌入式开发:C 开发人员应遵循的 3 个显式编程技巧】这些提示有助于使代码更清晰 , 并有助于嵌入式开发人员理解代码的真正意图 。 现在 , 这些可能不是导致所有这些损失的隐式代码的最佳做法 , 但它们确实让你认为你应该编写尽可能清晰的软件 。
- 安卓|谷歌发布Android 13开发者预览版,首批适配多款谷歌手机
- pi|安卓13来了!谷歌Android 13首个开发者预览版发布
- 安卓|首个Android 13开发者预览版来了,以重新关注隐私和安全为核心
- 美团|外卖商家为何不联合开发专属APP来摆脱美团压榨?作为外卖骑手我想说一说
- AR|Apple 正在为其即将推出的 AR/VR 耳机开发 real-OS
- 苏宁易购|优秀的软件开发及技术服务商——恒拓开源
- 投资|韩国将追加投资 283 亿韩元用于自动驾驶技术开发
- 安卓谷歌正在开发单独的 UWB API,允许第三方安卓 App 使用
- 突触器件|中国科大开发出媲美人脑能效的类脑突触原型器件
- met为元宇宙「打地基」,Meta 开发世界最快 AI 超级计算机