面向对象编程已成为开发应用程序的一种非常流行和关键的编程方法。虽然传统的嵌入式开发大多是使用过程语言 C 开发的,但 C++ 和其他面向对象的语言正慢慢开始在实时系统中获得牵引力。为了确保基于 C++ 的应用程序不会膨胀代码并充分利用面向对象的技术,这里有5个使用 C++ 为基于微控制器的系统开发实时应用程序的技巧。
技巧1 – 将 constexpr 用于常量,而不是 #define
在为实时系统开发 C++ 应用程序时,constexpr 关键字优于#define。constexpr 关键字保证是编译时常量,并且与#define 不同,它具有明确定义的类型信息。例如,想要在 C 中创建版本号的开发人员可能会这样写:
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_RELEASE 0
在 C++ 中,首选方法如下:
constexpr unsigned int version_major = 1U;
constexpr unsigned int version_minor = 0U;
constexpr unsigned int version_release = 0U;
请注意,我们可以清楚地将 const 定义为 unsigned int。constexpr 关键字还可用于创建其他类型的常量,例如 int、float、数组等。
技巧2 – 使用命名空间来组织和封装应用程序数据
在 C 中,嵌入式开发人员倾向于通过使用结构或使用预处理器来定义常量值来组织数据。在 C++ 中,开发人员可以通过使用命名空间来组织应用程序数据,以便对其进行封装、组织和易于阅读。C++ 中的命名空间可以使用以下语法定义:
namespace data
{
unsigned int mydata;
}
在这种情况下,命名空间是数据,并且有一个成员 mydata。访问命名空间可以通过编写完成:
data::mydata
它使用范围解析运算符来指定 mydata 位于数据中。建议使用匿名命名空间、名称如 data 的命名空间来创建局部静态变量。
技巧3 – 在 NULL 上使用 nullptr
C 中经常遇到的一个问题是多个库文件中定义了 NULL,并且每个定义不一致。这通常会导致混淆和使用 NULL 的潜在问题。在 C++ 中,定义了一个新的关键字 nullptr,可用于将指针分配给 null 并检查指针当前是否为 null。例如,
// by default is initialized to null
unsigned int * myptr;
if(myptr == nullptr)
{
// Do something to initialize pointer
}
技巧4 – 使用模板
模板允许嵌入式开发人员创建可应用于不同类型数据的函数或类。这允许开发人员创建单个函数或类,该函数或类可以轻松地为不同的应用程序重用和扩展。模板可以通过在函数或类前面使用 template 关键字轻松创建,如下所示:
template
void myFunction(const T&)
{
// Perform work on T
}
然后可以通过执行以下操作将该函数用于不同的数据类型:
myFunction(1); // Passing in an int
myFunction(3.14) // Passing in a float
模板是一个非常强大的功能,可以显着提高代码重用和可伸缩性。
技巧5 – 使用内置的 bool 类型
在 C 中使用 bool 总是感觉很棘手。嵌入式开发人员必须找到正确的库 stdbool.h,但似乎并非每个编译器都支持该库,并且经常迫使开发人员创建自己的定义。即使 bool 很容易找到,bool 也可以保存一个值,而不仅仅是简单的真假,因为它存储的不仅仅是一个位。任何 1 或更大的值都被认为是真的。更糟糕的是,开发人员应该使用 TRUE、True 还是 true! C++ 有一个内置的 bool 类型,它只能保存 true 或 false 的值。一些非常简单的东西,它使应用程序的编程更简单,并且可以使软件更易于阅读。
结论
希望在实时应用程序中使用 C++ 的嵌入式开发人员应该遵循更多更改和建议,但这些技巧将帮助开发人员入门。