ได้รับการป้องกันการเขียนโปรแกรมเชิงวัตถุที่มุ่งเน้นไปที่ต่ำด้วย 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 ในฐานะผู้เขียนฉันต้องสารภาพว่าต้องใช้เวลาอย่างมากในการหาวิธีจัดการกับการตรวจสอบประเภทที่เข้มงวดและรูปแบบเริ่มต้นนั้นน่าเกลียดและขัดกันง่าย ต้องขอบคุณการมีส่วนร่วมที่สร้างแรงบันดาลใจของ Simon Qian ทำให้ใช้เวลาอีกสามเดือนในการปรับแต่ง Plooc ให้เป็นสิ่งที่สง่างามและเรียบง่าย การสนับสนุนของ Henry Long ก็สำคัญเช่นกัน
ฉันหวังว่าคุณจะสนุกกับวิธีการที่ไม่เหมือนใครในการท้าทายการเขียนโปรแกรมเชิงวัตถุใน C
หากคุณมีคำถามหรือคำแนะนำใด ๆ โปรดแจ้งให้เราทราบ
[08/25/2024] แก้ไขเทมเพลตคลาสเวอร์ชัน 4.6.4
อัปเดต readme
เพิ่ม __plooc_malloc_align() และ __plooc_free
เพิ่ม private_method() , protected_method() และ public_method()
ลบการพึ่งพาในส่วนขยาย GNU
การเปลี่ยนแปลงเล็กน้อยอื่น ๆ
[11/02/2022] Fix Class Template, เวอร์ชัน 4.6.3
[12/05/2022] ปรับปรุงความเข้ากันได้กับภาษา C ++ ล่าสุดเวอร์ชัน 4.6.2
[02/01/2022] เพิ่มมาโครผู้ช่วยสำหรับกองรุ่น 4.6.1
__new_class() และ __free_class() สำหรับการใช้ malloc และฟรีร่วมกับตัวสร้างและ destructors เช่น 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 Footprint, เวอร์ชัน 4.52
[21/01/2020] การอัปเดต MISC สำหรับ C90, เวอร์ชัน 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 | Simon Qian |
| plooc_class_simple_c90.h | Gorgonmeducer |
| โมดูล | ผู้เข้าร่วม |
|---|---|
| วิธีกำหนดชั้นเรียน | Gorgonmeducer |
| วิธีเข้าถึงสมาชิกที่ได้รับการป้องกัน | Gorgonmeducer |
| วิธีการใช้ polymorphism | 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));
