PLOOC ['PLU:k]として知られるANSI-Cを使用したANSI-Cを使用した低オーバーヘッドオブジェクト指向プログラミングは、次のような十分に磨かれた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では、ヒープまたはプールメモリ管理の使用を強制せず、Garbage Collection(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()))を使用してマスクアレイのAlignment属性を設定する必要があります。
PLOOCは、タイプチートに依存するのではなく、異なるスキームで「プライベート保護」機能を提供します。これにより、C99機能を有効にするほぼすべてのCコンパイラをサポートできます。著者として、私は、厳格なタイプチェックに対処する方法を理解するのにかなりの時間がかかったことを告白しなければなりません。そして、初期スキームはugいで直感に反していました。サイモン・チアンの刺激的な貢献のおかげで、エレガントでシンプルなものにプログラムを改良するのにさらに3か月かかりました。ヘンリー・ロングのサポートも重要でした。
Cのオブジェクト指向プログラミングの課題に対するこのユニークなアプローチをお楽しみください。
ご質問や提案がある場合は、お気軽にお知らせください。
[08/25/2024]クラステンプレートを修正、バージョン4.6.4
readmeを更新しました
__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のその他の更新、バージョン4.51
[2019年9月6日] C89/90、バージョン4.50のサポートが追加されました
[2019年9月5日] C89/90、バージョン4.40のサポートが追加されました
[2019年8月15日] PLOOC_CLASS_STRICT.Hを更新して、より柔らかい構文を使用して、バージョン4.31
[2019年8月14日]過負荷の限られたサポートのサポートを導入しました、バージョン4.30
[2019年7月26日]構文更新、バージョン4.21
[2019年7月24日]新しいOOCクラステンプレートバージョン4.20を追加しました
[2019年7月12日]マイナーアップデート、バージョン4.13
[2019年5月30日]マイナーアップデート、バージョン4.12
[2019年5月2日]効率の向上、バージョン4.11
[2019年5月1日]互換性の改善、バージョン4.04
[2019年4月20日] 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. *
* *
****************************************************************************/
| モジュール | Contrinutor |
|---|---|
| PLOOC.H | ゴルゴンメダューサー |
| plooc_class.h | ゴルゴンメダューサー、サイモンチアン |
| plooc_class_strict.h | ゴルゴンメダューサー |
| plooc_class_back_box.h | ゴルゴンメダューサー |
| plooc_class_simple.h | サイモン・チアン |
| plooc_class_simple_c90.h | ゴルゴンメダューサー |
| モジュール | Contrinutor |
|---|---|
| クラスを定義する方法 | ゴルゴンメダューサー |
| 保護されたメンバーにアクセスする方法 | ゴルゴンメダューサー |
| 多型を実装する方法 | ゴルゴンメダューサー |
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));
