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