C++ 中的结构和类
C++ 仍然是嵌入式开发的少数语言,但当项目变得太大而无法有效使用 C 时,开发人员通常会采用 C++。这些开发人员通常从 C 过渡到 C++,语言之间的细微差异代表了他们学习曲线的重要组成部分。 C++ 有结构,就像 C 一样,因为它们不一样。 C++ 有类,它们与结构非常相似。本文解开这些语言元素的细节。
C 中的结构
C 中的结构是自定义的复合数据项(对象),它可以从现有的内置数据类型 (int , 字符 等)、位域(指定位大小的整数)和其他结构。这个想法是聚合一些属于一起的数据项。例如,保存 3 维坐标的结构可能如下所示:
结构坐标{ float x;浮动 y;浮动 z;};
这段代码告诉编译器什么是结构坐标 好像。然后你可以继续声明这种类型的变量:
结构坐标位置;
变量位置 属于结构坐标类型 其内部字段可以使用“点”运算符寻址:
location.x =1.0;location.y =2.0;location.z =9.99;
当然,使用三个独立的 float 也可以达到类似的效果 名称类似于 location_x 的变量 等等 但是,处理位置要容易得多 作为可以传递给函数等的单个变量
包含位域的能力为结构提供了 C 中其他地方没有的能力。这是一个例子:
struct bitreg{ unsigned up:3;未签名:3;无符号极性:2;};
struct bitreg 类型变量中的每个字段 具有特定的位大小。编译器确保数据以合理的方式存储,因此我们希望这样的变量适合一个字节。此外,所有访问字节内字段的“位攻击”代码都是自动生成的。因此,程序员可以简单地访问它们:
struct bitreg 控制; control.up =1;control.down =2;control.polarity =3;
在大多数情况下,在 C 中使用结构非常简单,并且使代码更易于理解,并且不会影响执行效率。但是,嵌入式开发人员应该注意两点:
- 现代高端(通常为 32 位)处理器的指令集可以轻松适应结构的使用。事实上,它们就是为了做到这一点而设计的。但是,大多数低端 CPU 无法提供这样的效率,因此在使用结构时需要小心。
- 位字段是一个很好的功能,可以生成高效且可读的代码。嵌入式开发人员可能会立即发现一个机会:使用位域访问设备控制寄存器。许多外围设备都有包含各种位域的 1 字或 1 字节宽的寄存器。这看起来是一场绝妙的搭配,有时也能奏效。但是有两个问题:
- 位域的确切布局由编译器决定。如果一切都正确映射到设备上,则代码可能会正常工作。但是,更改编译器,甚至只是更新编译器,都可能会破坏代码。
- 编译器生成的用于访问位域的代码很可能会使用许多 AND/OR 运算和对寄存器的多次访问,这可能会出现问题。此外,一些设备寄存器是只写的,永远不会出现在编译器生成的代码中。
尽管 C 结构看起来有点像一种新的数据类型,但实际上并非如此。一个数据类型通常有一系列可以对其执行的操作;这不是 C 结构的情况。要对 C 结构执行任何操作,除了创建指向它的指针之外,您还需要访问内部字段。这个问题是在 C++ 中解决的。
C++ 中的类
C++ 语言具有许多面向对象的功能。其中之一是类的概念 ,它可以描述更像新数据类型的东西。一个变量(通常称为对象 ) 可以实例化 从班级;即它是这种新类型的对象。
C++ 类具有与 C 结构几乎完全相同的语法和一些非常相似的功能。但是,有一些重要的区别:
- 一个类也可以包含函数(称为方法 ).
- 成员变量和方法对外界是隐藏的,除非它们的声明遵循public:
- 可以有一对特殊的方法——构造函数和析构函数——它们分别在类(一个对象)的实例被创建和销毁时自动运行。
- 可以使用特殊方法(成员函数)定义处理新数据类型的运算符。
- 一个类可以用作定义另一个类的基础(这称为继承 ).
- 声明一个新类型的变量(类的一个实例;一个对象)只需要类的名称——关键字class 不是必需的。
本示例说明了其中大部分功能:
class myclass{ char a; int b;public:void fun();我的课(); ~myclass();}; myclass myobj; myobj.fun();
成员变量a 和 b 只能被三个成员函数fun()访问 , myclass() 和 ~myclass() .后两个函数是构造函数和析构函数。只有好玩() 很可能被用户代码调用。所有三个函数的实际代码将在别处定义,使用 :: 与类相关联 运算符,因此:
void myclass::fun(){ ...
C++ 中的结构
除了类之外,C++ 还具有向后兼容 C 的结构。但是,C++ 结构还具有与类拥有的相同的附加功能。这只是 C++ 中结构和类之间的一个区别。正如我们所见,类中成员变量和函数的默认可访问性是私有的;结构中的默认值是公共的。因此,前面的类的功能也可以这样表达:
struct mystruct{ void fun();我的课(); ~myclass();private:char a; int b;};
在 C++ 中使用类和结构
获得这些信息后,我们敦促您不要过度利用它。当您需要额外的功能时,有很多原因只使用结构来实现它们在 C 和类中提供的功能类型。首先,这是代码可读性的问题。另一位开发人员可能对细节不太清楚,以“非标准”方式编写的代码会令人困惑。
编写代码时的一个关键优先事项是确保它是可读的(=可维护的)。有人——可能是你——可能需要在一年后查看这段代码并了解它的作用。一些建议:假设维护您代码的人是一名武装精神病患者,他的耐心有限,并且知道您的家庭住址。
嵌入式