嵌入式系统开发人员应尽可能明确,以避免ASSUME综合症并在其系统中产生意外行为。在今天的文章中,让我们来看看嵌入式开发人员可以以更明确的方式清理代码的几个方面。显式编程技巧#1–将extern与公共函数一起使用我们都知道我们不应该使用extern,因为它会创建全局变量,这反过来会导致各种问题。但是,实际使用extern的好地方是在创建公共函数时。当你定义一个公共函数时,你在头文件中创建声明或原型:voidFoo(void);它在标题中,所以很明显它是一个公共外部函数。但是,我遇到过这样的情况,您正在维护别人编写的模块,并且在像Bar这样的函数的标头中没有公共API,但它的定义如下:voidBar(void){...}for这个函数的用途是什么?它应该是私有的并且前面有一个静态吗?它应该是公开的并在标题中定义吗?如果嵌入式开发人员将Bar定义为:externBar(void){...}我们将知道它是公开的并且在API中丢失,并且链接器仍然能够找到它,尽管有人调用它。显式编程技巧#2-将指针作为const传递给函数,除非它们改变指针是危险的,如果它们在执行期间意外地增加、减少或以某种意想不到的方式被修改,它们很容易导致灾难。我经常遇到这样的函数声明:voidFoo(uint32_t*Param1);这个声明是如此隐含,我读到它的目的是传递一个指向uint32_t的指针,其中允许指针和指向Location的uint32_t内存更改!这是嵌入式开发人员的意图吗?如果他们只是想传递一个指向变量的指针,以便它通过引用传递并且可以被函数修改怎么办?这个函数就是这样做的,但他们也打开了修改指针的选项!下面的语句对我来说很清楚,指针不会改变,指向的值可以改变:voidFoo(uint32_t*constParam1);该参数是指向uint32_t内存位置的常量指针。指针不能在函数内更改,但它指向的内容可以。因此,如果有人在函数中执行以下操作:Param++;编译器会说“不!错误!”,让维护者清楚他们不应该这样做。显式编程技巧#3–将“无引用”变量作为const传递现在,这通常会让嵌入式开发人员感到兴奋,而且不是以一种好的方式。有人告诉我这是胡说八道,但同样,它使代码对任何开发人员(包括新手)都清晰明了。这里的想法是我可能有一个这样声明的函数:voidFoo(uint32_tParam1);在这种情况下,我通过复制而不是引用来传递参数,以供函数使用。该函数理论上可以对本地副本执行任何操作。但是,如果有人维护这段代码,他们是否知道我们想要获取一个参数并将其用作常量?对我来说,除非声明如下:voidFoo(constuint32_tParam1);否则我一无所知。这告诉我该参数不应在本地使用的副本中更改或修改。这些提示有助于使代码更清晰,并帮助嵌入式开发人员理解代码的真正意图。现在,这些可能不是导致所有这些损失的隐式编码的最佳实践,但它们确实让您认为您应该编写尽可能清晰的软件。
