许多嵌入式应用程序仍使用c语言编写,但越来越多的嵌入式开发人员现在使用C++语言编写程序。某些应用程序甚至共享这两种语言。这有意义吗?
C是嵌入式应用中最常用的编程语言。多年来,人们一直期待着向C++过渡,但过渡速度相当缓慢。但是,许多开发人员正在考虑或计划这样做。C++实质上是c的超集。因此,这两种语言完全可以混合使用。
虽然c和C++可以混合使用,但有三个问题:
为什么要这么做?
怎么做?
有什么缺点或问题吗?
为什么在嵌入式应用程序中混合使用C和C++代码?
简单的答案是遗留代码。一个新项目很少从头开始。如果是这样,嵌入式开发人员可以用C++编写所有内容。
然而,更合理的出发点和更可能的是重用现有代码,无论是从内部还是外部源代码。这段代码是C。因此,要继续使用C++,这两种语言的混合几乎是不可避免的。
如何混合C和C++代码?
C和C++共存有两种基本方式:
方法A:混合代码的明显方法是嵌入式开发人员用自己的编译器编译每个模块,然后将所有对象模块连接在一起。然而,这会立即导致一个问题:报告链接错误。这是因为C++编译器更改了函数的名称,这被称为“mangling”。
这些更改生成由原始标识符和函数参数的数量和类型的组合组成的唯一名称。这有两个原因:第一,当函数声明、定义和调用不匹配时,会发生链接错误。[这被称为“类型安全链接”。]其次,它有助于重载函数,其中两个函数具有相同的名称,但具有不同的参数组合;“mangling”使每个名称都唯一。
这个问题可以用外部C结构来解决。使用此限定符声明C++函数意味着其名称不会更改。C函数的外部声明应用程序确保C++编译器不会管理对该函数的调用。
方法B:另一种方法是使用C++编译器编译C代码,即将其视为C++代码。如果C是C++的真正子集,这将无缝地工作。事实上,嵌入式开发人员需要非常小心地“清理”代码并确保它真正兼容。
混合C和C++代码有什么缺点吗?
混合这两种语言的缺点很少。在方法A中,存在类型安全链接丢失的问题。然而,这只适用于从C++调用的C函数,反之亦然。其他C++函数不受影响。当然,公共函数不能重载。
从长远来看,方法B的应用更好,因为一旦清理干净,代码就可以被当作C++处理,并且可以使用该语言的函数。
如前所述,清洁过程并不简单。因此,嵌入式开发人员必须权衡工作的成本效益比率和未来使用遗留代码的可能性。