原文地址:https://github.com/GorgonMeducer/PLOOC
介绍
PLOOC是使用ANSI-C(又名PLOOC ['plu:k])进行的受保护的低开销面向对象编程,它是一组经过精心修饰的C宏模板,这些模板可:
- 为私有class成员提供保护
注意:可以通过定义宏__OOC_DEBUG__来禁用保护,以方便调试。
- 支持受保护的成员
- 支持多重继承
- 支持实现接口
- 在某些编译器中支持严格的类型检查/验证,例如启用了多文件编译的IAR。
- 符合ANSI-C99
还支持ANSI-C90,但私有功能保护已禁用。 - 支持超载
需要C11 或者 _Generic - 低开销
注意:几乎零开销。该模板充分利用了ANSI-C强制执行的编译规则,以最低的成本提供了所需的OO功能。
- Suitable for both bare-metal and RTOS. - Suitable for both 8bit and 32bit MCU
是什么使PLOOC与其他OOC有所不同?
OOC的概念并不新鲜。有很多库,SDK,模板,它们提供了面向对象的ANSI-C语言编程扩展。尽管PLOOC在代码大小和性能上都强调了其低开销功能,但是许多基于宏模板的ooc解决方案也具有低开销。PLOOC不会强制您使用堆或池进行内存管理,它不提供GC功能。它只是将这些选项留给用户使用,因此它甚至适用于8位系统。好吧,您可以将此作为PLOOC的缺点。我不想为此争论。
那么,真正使PLOOC与众不同的是什么?它仅仅是另一个重新发明的轮子吗?
答案是不。当然。PLOOC带来了其他大多数人所没有的独特功能。它使class的私有成员真正成为私有,即受保护的。因此,将阻止类源代码之外的用户访问私有成员。他们看到的将是固态存储器,即使用字节数组创建的掩码。由于类是由C中的结构模仿的,因此PLOOC中的类是使用masked-structure实现的。正如人们所期望的那样,只有类源代码才能访问私有成员,只有派生类的类源代码才能访问基类的受保护成员,每个人都可以访问公共成员。
怎么会这样 您可能已经简单地通过“ masked-structure”一词弄清楚了。正如您所注意到的,它可能不过是头文件中一个花哨的类型欺骗技巧。在遇到一些严格的类型检查编译器之前,类型作弊技巧很有效。最著名(臭名昭著)的是启用了多文件编译模式的IAR。没有类型欺骗可以从IAR多文件编译模式的血腥斧头中幸存下来。
//! the original structure in class source code
struct byte_queue_t {
uint8_t *pchBuffer;
uint16_t hwBufferSize;
uint16_t hwHead;
uint16_t hwTail;
uint16_t hwCount;
};
//! the masked structure: the class byte_queue_t in header file
typedef struct byte_queue_t {
uint8_t chMask [sizeof(struct {
uint8_t *pchBuffer;
uint16_t hwBufferSize;
uint16_t hwHead;
uint16_t hwTail;
uint16_t hwCount;
})];
} byte_queue_t;
为了使其工作,我们必须确保类源代码不包括其自己的接口头文件。您甚至可以这样做…如果您对内容很认真
//! the masked structure: the class byte_queue_t in header file
typedef struct byte_queue_t {
uint8_t chMask [sizeof(struct {
uint32_t : 32;
uint16_t : 16;
uint16_t : 16;
uint16_t : 16;
uint16_t : 16;
})];
} byte_queue_t;
PLOOC通过类型欺骗以外的其他方案提供“私有保护”功能,因此它支持启用了C99功能的几乎所有C编译器。作为作者,我不得不承认,我花了很多时间才弄清楚如何处理严格类型检查,并且最初的方案是丑陋的和违反直觉的。多亏了SimonQian所做的鼓舞人心的贡献,我花了3个月的时间才使PLOOC变得优雅而简单。HenryLong的支持也至关重要。
我希望您能喜欢这种独特的尝试,以应对面向对象的编程挑战。
如果您有任何疑问或建议,请随时告诉我们。
贡献
模板
module | Contrinutor |
---|---|
plooc.h | GorgonMeducer |
plooc_class.h | GorgonMeducer, Simon Qian |
plooc_class_strict.h | GorgonMeducer |
plooc_class_back_box.h | GorgonMeducer |
plooc_class_simple.h | Simon Qian |
plooc_class_simple_c90.h | GorgonMeducer |
例子
module | Contrinutor |
---|---|
如何定义一个 class | GorgonMeducer |
如何访问受保护的成员 | GorgonMeducer |
如何实现多态 | GorgonMeducer |
使用PLOOC的应用程序/项目
[VSF] [ https://github.com/vsfteam/vsf ]
[GMSI] [ https://github.com/GorgonMeducer/Generic_MCU_Software_Infrastructure ]
如何使用
PLOOC的示例
介绍
为了说明PLOOC如何简单易用,提供了一些示例来演示新OOPC方法的不同方面。当前,可用示例为:
- byte_queue
- enhanced_byte_queue
更多示例将在以后添加…
示例1:如何定义一个类
这个例子说明
- 如何定义一个class
- 如何添加私有会员
- 如何添加受保护的成员
- 如何访问class成员
- 如何定义用户友好接口
示例2:如何访问受保护的成员
- 如何从基类继承
- 如何访问从基继承的受保护成员
- 如何继承接口
- 如何覆盖基本方法
示例3:如何实现重载
- 如何使用PLOOC实现重载
- 需要C11支持