用ANSI-C(称为PLOOC ['plu:k])受保护的低空面向对象的编程,是一组精心涂层的C型宏观模板:
注意:可以通过定义宏
__OOC_DEBUG__来促进调试来禁用此保护。
_Generic 。注意:开销几乎为零。该模板充分利用ANSI-C的强制编译规则,以最少的成本提供面向对象的功能。
- Suitable for both bare-metal and RTOS environments.
- Suitable for both 8-bit and 32-bit MCUs.
面向对象的C(OOC)的概念并不是什么新鲜事物。有许多具有面向对象的编程功能扩展ANSI-C的库,SDK和模板。尽管PLOOC在代码尺寸和性能方面都强调了其低开销,但许多基于宏观的OOC解决方案也提供了较低的开销。 PLOOC不强迫您使用堆或池内存管理,也不提供垃圾收集(GC)功能,而将这些选项留给用户。这使其适用于8位系统。虽然有些人可能将其视为缺点,但这是故意的设计选择。我不会为此争论。
那么,是什么真正使Plooc与众不同呢?它只是另一个重新发明的轮子吗?
答案是否定的。
PLOOC引入了一个独特的功能,大多数其他解决方案都缺乏:它确保了班级的私人成员是真正的私人和受保护的。这意味着阻止类源代码外的用户访问这些私人成员。取而代之的是,他们只看到一个坚实的内存块,被掩盖为字节数组。由于C中的类别由结构模仿,因此PLOOC使用掩盖结构实现类。正如预期的那样,只有类源代码才能访问私有成员,并且只有派生类的类源代码才能访问基类的受保护成员。但是,所有人都可以访问公共成员。
这是如何运作的?您可能已经从“蒙版结构”一词中猜到了它。本质上,这是标题文件中的类型技巧。
此技巧效果很好,直到遇到严格的类型检查编译器为止。最著名的(或臭名昭著的)例子是IAR,尤其是当启用多文件汇编模式时。没有类型的技巧可以在IAR的多文件汇编模式的严格检查中幸存下来。
//! The original structure in the 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 the 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 the 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;
注意:提供了上述代码段来说明基本方案,但不实用,因为创建掩码数组时缺少原始结构的对齐方式。要解决此问题,您需要使用
__alignof__()操作员提取对齐信息,并使用__attribute__((aligned()))相应地设置蒙版数组的对齐属性。
PLOOC提供了具有不同方案的“私人保护”功能,而不是依靠类型作用。这使其可以支持启用具有C99功能的几乎所有C编译器。作为作者,我必须承认,花了大量时间来弄清楚如何处理严格的类型检查,而初始方案既丑陋又违反直觉。多亏了西蒙·齐安(Simon Qian)的鼓舞人心的贡献,又花了三个月的时间才能将plooc完善成优雅而简单的东西。亨利·朗的支持也至关重要。
希望您喜欢这种独特的方法来应对C.
如果您有任何疑问或建议,请随时告诉我们。
[08/25/2024]修复类模板,版本4.6.4
更新的读数
添加__plooc_malloc_align()和__plooc_free
添加private_method() , protected_method()和public_method()
删除对GNU扩展的依赖性
其他小变化。
[11/02/2022]修复类模板,版本4.6.3
[12/05/2022]提高与最新C ++语言的兼容性,版本4.6.2
[02/01/2022]为堆添加辅助宏,版本4.6.1
__new_class()和__free_class()以使用malloc,并与构造函数和驱动器一起免费使用,即xxxx_init()和xxxx_depose() 。[30/12/2021]改进了CMSIS-PAC,版本4.6.0
[29/12/2021]添加CMSIS-PACK,版本4.5.9
[28/11/2020]次要更新,版本4.5.7
[05/08/2020]添加__plooc_class_implement__和__plooc_class_inherit__版本4.5.6
[18/05/2020]介绍了宏观的简短和长方形,版本4.5.5
[16/05/2020]次要更新,版本4.5.4a
[11/05/2020]次要更新,版本4.5.4
[15/04/2020]更新__plooc_eval,版本4.5.3
[19/02/2020]启用RAM足迹优化的次要更新,版本4.52
[21/01/2020] C90的MISC更新,版本4.51
[09/06/2019]增加了对C89/90,版本4.50的支持
[09/05/2019]增加了对C89/90,版本4.40的支持
[08/15/2019]更新了PLOOC_CLASS_STRICT.H,使用更多软性语法,版本4.31
[08/14/2019]引入了对超载的有限支持,版本4.30的支持
[07/26/2019]语法更新,版本4.21
[07/24/2019]添加了新的OOC类模板,版本4.20
[07/12/2019]次要更新,版本4.13
[05/30/2019]次要更新,版本4.12
[05/02/2019]效率提高,版本4.11
[05/01/2019]兼容性提高,版本4.04
[04/20/2019]将PLOOC上传到GitHub,版本4.03
[04/17/2019]将PLOOC上传到GitHub,版本4.01
PLOOC库是由Gorgonmeducer(王卓然)撰写的,[email protected]和Simon Qian (钱晓晨)https://github.com/versaloon在Henry Long [email protected]的支持下。
PLOOC库是根据开源许可证Apache 2.0发布的,该库允许商业和非商业用途均无限制。唯一的要求是,信用量是在源代码和产品的文档中给出的。
完整的许可文本如下:
/*****************************************************************************
* Copyright(C)2009-2019 by GorgonMeducer<[email protected]> *
* and SimonQian<[email protected]> *
* with support from HenryLong<[email protected]> *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
****************************************************************************/
| 模块 | 禁忌者 |
|---|---|
| plooc.h | Gorgonmeducer |
| plooc_class.h | Gorgonmeducer,Simon Qian |
| plooc_class_strict.h | Gorgonmeducer |
| plooc_class_back_box.h | Gorgonmeducer |
| plooc_class_simple.h | 西蒙·钱 |
| plooc_class_simple_c90.h | Gorgonmeducer |
| 模块 | 禁忌者 |
|---|---|
| 如何定义课程 | Gorgonmeducer |
| 如何访问受保护的成员 | Gorgonmeducer |
| 如何实施多态性 | Gorgonmeducer |
为了展示PLOOC如何易于易于使用,提供了示例以演示新的OOPC方法的不同方面。目前,可用示例是:
更多示例将在以后添加...
此示例显示
如何使用PLOOC实施过载
需要C11支持
LOG_OUT("rn-[Demo of overload]------------------------------rn");
LOG_OUT((uint32_t) 0x12345678);
LOG_OUT("rn");
LOG_OUT(0x12345678);
LOG_OUT("rn");
LOG_OUT("PI is ");
LOG_OUT(3.1415926f);
LOG_OUT("rn");
LOG_OUT("rnShow BYTE Array:rn");
LOG_OUT((uint8_t *)main, 100);
LOG_OUT("rnShow Half-WORD Array:rn");
LOG_OUT((uint16_t *)main, 100/sizeof(uint16_t));
LOG_OUT("rnShow WORD Array:rn");
LOG_OUT((uint32_t *)main, 100/sizeof(uint32_t));
