Защищенное объектно-ориентированное программирование с низкопользой с 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) не является новой. Существует множество библиотек, SDK и шаблонов, которые расширяют ANSI-C с объектно-ориентированными функциями программирования. Хотя 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 предоставляет функцию «частной защиты» с другой схемой, а не полагаться на шить типа. Это позволяет ему поддерживать почти все компиляторы C с включенными функциями C99. Как автор, я должен признаться, что потребовалось значительное время, чтобы выяснить, как справиться со строгой проверкой типов, и начальная схема была как уродливой, так и нелогичной. Благодаря вдохновляющему вкладу Саймона Цянь, потребовалось еще три месяца, чтобы превратить Plooc во что -то элегантное и простое. Поддержка Генри Лонга также имела решающее значение.
Я надеюсь, что вам понравится этот уникальный подход к проблемам объектно-ориентированного программирования в C.
Если у вас есть какие -либо вопросы или предложения, пожалуйста, сообщите нам об этом.
[25.08.2024] Исправить шаблон класса, версия 4.6.4
Обновлено readme
Добавить __plooc_malloc_align() и __plooc_free
Добавить private_method() , protected_method() и public_method()
Удалить зависимость от расширений GNU
Другие незначительные изменения.
[02/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] Небольшое обновление для включения оптимизации следа ОЗУ, версия 4.52
[21/01/2020] Обновление MISC для C90, версия 4.51
[09/06/2019] Добавлена поддержка C89/90, версия 4.50
[09/05/2019] Добавлена поддержка C89/90, версия 4.40
[15.08.2019] Обновлено PLOOC_CLASS_STRICT.H, чтобы использовать больше смягченного синтаксиса, версия 4.31
[14.08.2019] Внедренная поддержка ограниченной поддержки для перегрузки, версия 4.30
[26.07.2019] обновление синтаксиса, версия 4.21
[24.07.2019] Добавлен новый шаблон класса OOC, версия 4.20
[12.07.2019] Небольшое обновление, версия 4.13
[05.05.2019] Небольшое обновление, версия 4.12
[05/02/2019] повышение эффективности, версия 4.11
[05/01/2019] Улучшение совместимости, версия 4.04
[20.04.2019] Загрузите Plooc в GitHub, версия 4.03
[17.04.2019] Загружено PLOOC TO GITHUB, версия 4.01
Библиотека PLOOC была написана GorgonMeducer (王卓然) [email protected] и Саймон Цянь (钱晓晨 钱晓晨 钱晓晨 钱晓晨 钱晓晨 钱晓晨 https://github.com/versoloon с поддержкой Генри Лонг Генри[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, Саймон Цянь |
| 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));
