编写嵌入式系统常量参数的最佳实践

Sdl*_*ion 8 c embedded const c-preprocessor

对于嵌入式系统,这是C"中"static const"与"#define"的情况.

在具有"传递"代码和模块的大/中项目中,为包含文件,模块等编写常量参数的最佳实践是什么?

在代码"pass-down"中,您不知道您选择的名称是在其他包含文件中定义的,还是可能在extern中调用,或者在可能包含您文件的其他文件中调用.

有这三个选项:

  1. static const int char_height = 12;
  2. #define CHAR_HEIGHT 12
  3. enum { char_height = 12 };

哪一个会更好(在具有未知内存限制的嵌入式系统上)?

原始代码主要#define用于此,但这些常量是以几种方式随意实现的(并且在不同的位置甚至在相同的文件中),因为似乎有几个人为某个设备开发了这个演示软件.

具体来说,这是一个演示代码,展示了某个设备的每个硬件和SDK功能.

我正在考虑的大多数数据是用于配置环境的类型:屏幕尺寸,字符集特征,以及提高代码可读性的东西.不是编译器和预处理器可以执行的自动配置.但由于那里有很多代码,我担心全局名称冲突,我不愿意使用#define's

目前,我正在考虑从头开始重写项目并重新实现大多数已编写的函数以从一个c文件中获取常量或将常量的实现重新组织为一种样式会更好.

但:

  1. 这是一个单人项目(因此重新实施所有内容需要花费大量时间)
  2. 已经实现的代码可以工作,并且已经多次修改.(如果没有破坏......)

bbl*_*coe 5

始终考虑可读性和内存限制.此外,宏只是编译前发生的复制/粘贴操作.说到这一点,我想做以下事情:

  • static const如果它们要在一个c文件中使用(例如,不能跨多个文件全局访问),我将所有变量定义为常量变量.const在文件范围内,任何定义的内容都应放在ROM中.显然,在初始化后你不能改变这些变量.
  • 我使用定义所有常量值#define.
  • 我使用enumerations来增加可读性.您拥有固定值范围的任何地方我更喜欢枚举来明确说明意图.

尝试使用面向对象的视角来处理项目(即使c不是OO).隐藏私有函数(不要在标题中创建原型),如果可以避免使用全局变量,则标记应该只存在于一个c模块(文件)中的变量static等.

  • Btw声明"这允许他们在ROM中而不是吃掉珍贵的RAM"很奇怪.`const`最终是在RAM还是ROM中取决于它在哪个范围内声明,以及编译器是否优化常量或者也不是.在这个问题所涉及的文件范围内分配的常量总是以ROM结尾. (2认同)