Geschützte programmierte programmierte, mit ANSI-C, PLOOC ['PLU: K] bekannt, ist ein Satz gut polierter C-Makro-Vorlagen, die:
Hinweis: Dieser Schutz kann deaktiviert werden, indem das MACRO
__OOC_DEBUG__definiert wird, um das Debuggen zu erleichtern.
_Generic .Hinweis: Der Overhead ist fast Null. Die Vorlage nutzt voll und ganz die erzwungenen Kompilierungsregeln von ANSI-C, um objektorientierte Merkmale mit minimalen erforderlichen Kosten zu liefern.
- Suitable for both bare-metal and RTOS environments.
- Suitable for both 8-bit and 32-bit MCUs.
Das Konzept des objektorientierten C (OOC) ist nicht neu. Es gibt zahlreiche Bibliotheken, SDKs und Vorlagen, die ANSI-C mit objektorientierten Programmierfunktionen erweitern. Obwohl PLOOC sowohl in der Codegröße als auch in der Leistung seinen niedrigen Overhead betont, bieten viele Makro-basierte OOC-Lösungen auch einen niedrigen Overhead. PLOOC zwingt Sie weder die Verwendung von Heap- oder Pool -Speicherverwaltung noch bietet sie Müllsammlung (GC) -Funktionen (und über gibt diese Optionen dem Benutzer. Dies macht es auch für 8-Bit-Systeme geeignet. Während einige dies als Nachteil ansehen, ist es eine bewusste Designauswahl. Ich werde darüber nicht streiten.
Also, was unterscheidet Plooc wirklich von den anderen? Ist es einfach ein weiteres neu erfundenes Rad?
Die Antwort ist nein.
PLOOC führt eine einzigartige Funktion vor, die den meisten anderen Lösungen fehlt: Es stellt sicher, dass die privaten Mitglieder einer Klasse wirklich privat und geschützt sind. Dies bedeutet, dass Benutzer außerhalb des Klassenquellcodes daran gehindert werden, auf diese privaten Mitglieder zuzugreifen. Stattdessen sehen sie nur einen soliden Speicherblock, der als Byte -Array maskiert ist. Da Klassen in C durch Strukturen nachgeahmt werden, implementiert PLOOC Klassen unter Verwendung einer maskierten Struktur. Wie erwartet kann nur der Klassenquellcode auf die privaten Mitglieder zugreifen, und nur der Klassenquellcode einer abgeleiteten Klasse kann auf die geschützten Mitglieder der Basisklasse zugreifen. Öffentliche Mitglieder sind jedoch für alle zugänglich.
Wie funktioniert das? Möglicherweise haben Sie es an den Begriff "maskierte Struktur" erraten. Im Wesentlichen handelt es sich um einen Trick mit dem Typ-schäbiger Trick in den Header-Dateien.
Dieser Trick funktioniert gut, bis er auf einen strengen Compiler-Compiler trifft. Das berühmteste (oder berüchtigte) Beispiel ist IAR, insbesondere wenn der Multi-Datei-Kompilierungsmodus aktiviert ist. Kein Trick mit Typ-cheatieren kann die strengen Überprüfungen des Multi-Datei-Kompilierungsmodus von IAR überleben.
//! 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;
Um diese Arbeit zu machen, müssen Sie sicherstellen, dass der Klassenquellcode keine eigene Schnittstellen -Header -Datei enthält. Sie können sogar noch weiter gehen, wenn Sie den Inhalt ernst nehmen:
//! 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;
HINWEIS: Die obigen Code -Snippets werden bereitgestellt, um das zugrunde liegende Schema zu veranschaulichen, aber nicht praktisch, da die Ausrichtung der ursprünglichen Struktur beim Erstellen des Maskenarrays fehlt. Um dies zu lösen, müssen Sie die Ausrichtungsinformationen mit dem
__alignof__()-Operator extrahieren und das Alignment -Attribut des Mask -Arrays unter Verwendung__attribute__((aligned()))festlegen.
PLOOC bietet die Funktion "Privatschutz" mit einem anderen Schema, anstatt sich auf Typ-Schummeln zu verlassen. Dies ermöglicht es ihm, fast alle C -Compiler mit aktivierten C99 -Funktionen zu unterstützen. Als Autor muss ich gestehen, dass es beträchtliche Zeit brauchte, um herauszufinden, wie man mit strikter Typ-Überprüfungen umgeht, und das anfängliche Schema war sowohl hässlich als auch kontraintuitiv. Dank der inspirierenden Beiträge von Simon Qian dauerte es weitere drei Monate, um Plooc zu etwas Elegantes und Einfaches zu verfeinern. Die Unterstützung von Henry Long war auch entscheidend.
Ich hoffe, Sie genießen diesen einzigartigen Ansatz für die Herausforderungen der objektorientierten Programmierung in C.
Wenn Sie Fragen oder Vorschläge haben, können Sie uns gerne wissen.
[25.08.2024] Klassenvorlage beheben, Version 4.6.4
Aktualisiert Readme
Fügen Sie __plooc_malloc_align() und __plooc_free hinzu
Fügen Sie private_method() , protected_method() und public_method() hinzu
Entfernen Sie die Abhängigkeit von den GNU -Erweiterungen
Andere kleinere Änderungen.
[11/02/2022] Klassenvorlage beheben, Version 4.6.3
[12/05/2022] Verbesserung der Kompatibilität mit der neuesten C ++ - Sprache, Version 4.6.2
[02/01/2022] Fügen Sie Helfer -Makros für Heap hinzu, Version 4.6.1
__new_class() und __free_class() für die Verwendung von Malloc hinzu und kostenlos zusammen mit Konstruktoren und Zerstörern, dh xxxx_init () und xxxx_depose () .[30/12/2021] Verbesserte CMSIS-PAC, Version 4.6.0
[29/12/2021] CMSIS-Pack, Version 4.5.9 hinzufügen
[28/11/2020] Minor Update, Version 4.5.7
[05/08/2020] hinzufügen __plooc_class_implement__ und __plooc_class_inherit__ Version 4.5.6
[18/05/2020] Einführung sowohl kurz- als auch Langstil des Makros, Version 4.5.5
[16/05/2020] Minor Update, Version 4.5.4a
[11/05/2020] Minor Update, Version 4.5.4
[15/04/2020] Update __plooc_eval, Version 4.5.3
[19/02/2020] Minor -Update, um die RAM -Fußabdruckoptimierung zu aktivieren, Version 4.52
[21/01/2020] Misc -Update für C90, Version 4.51
[09/06/2019] Unterstützung für C89/90, Version 4.50 hinzugefügt
[09.05.2019] Unterstützung für C89/90, Version 4.40 hinzugefügt
Aktualisiert PLOOC_CLASS_STRICT.H, um mehr weiche Syntax zu verwenden, Version 4.31
[14.08.2019] Einführte Unterstützung für die begrenzte Unterstützung für Überladung, Version 4.30
[26.07.2019] Syntax -Update, Version 4.21
[24.07.2019] neue OOC -Klassenvorlage hinzugefügt, Version 4.20
[07.07.2019] Minor Update, Version 4.13
[30.05.2019] Minor Update, Version 4.12
[05/02/2019] Effizienz verbessert, Version 4.11
[05/01/2019] Kompatibilität Verbesserung, Version 4.04
[04.04.2019] PLOOC in GitHub hochladen, Version 4.03
PLOOC auf GitHub, Version 4.01 hochgeladen
Die PLOOC -Bibliothek wurde von gorgonmeducer (王卓然) [email protected] und Simon Qian (钱晓晨) https://github.com/versaloon mit Unterstützung von Henry Long [email protected] geschrieben.
Die PLOOC-Bibliothek wird unter einem Open-Source-Lizenz Apache 2.0 veröffentlicht, mit dem sowohl die kommerzielle als auch die nicht kommerzielle Verwendung ohne Einschränkungen verwendet werden können. Die einzige Anforderung ist, dass Credits im Quellcode und in der Dokumentation für Ihr Produkt angegeben sind.
Der vollständige Lizenztext folgt:
/*****************************************************************************
* 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. *
* *
****************************************************************************/
| Modul | Kontrinutor |
|---|---|
| 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 |
| Modul | Kontrinutor |
|---|---|
| Wie man eine Klasse definiert | Gorgonmeducer |
| Wie man auf geschützte Mitglieder zugreift | Gorgonmeducer |
| Wie man Polymorphismus umsetzt | Gorgonmeducer |
Um zu zeigen, wie PLOOC einfach und einfach zu bedienen ist, werden Beispiele bereitgestellt, um verschiedene Aspekte der neuen OOPC -Methode zu demonstrieren. Derzeit sind die verfügbaren Beispiele:
Weitere Beispiele werden später hinzugefügt ...
Dieses Beispiel zeigt
So implementieren Sie Überladung mit PLOOC
Erfordern C11 -Unterstützung
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));
