用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));
