PLOOC [ 'PLU : K]로 알려진 ANSI-C를 사용한 보호 된 저온 객체 지향 프로그래밍은 다음과 같은 잘 알려진 C 매크로 템플릿 세트입니다.
참고 :이 보호는 Macro
__OOC_DEBUG__정의하여 디버깅을 용이하게하여 비활성화 할 수 있습니다.
_Generic 필요합니다.참고 : 오버 헤드는 거의 0입니다. 템플릿은 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 (Garbage Collection) 기능을 제공하지 않아 이러한 옵션을 사용자에게 남겨 둡니다. 이것은 8 비트 시스템에도 적합합니다. 어떤 사람들은 이것을 단점으로 볼 수 있지만, 의도적 인 디자인 선택입니다. 나는 이것에 대해 논쟁하지 않을 것이다.
그렇다면 무엇이 실제로 다른 사람들과 구별 되는가? 단순히 또 다른 재창조 된 바퀴입니까?
대답은 아니오입니다.
Ploooc은 대부분의 다른 솔루션에 부족한 고유 한 기능을 소개합니다. 수업의 개인 회원이 진정으로 개인적이고 보호되도록합니다. 이는 클래스 소스 코드 외부의 사용자가 이러한 개인 구성원에게 액세스 할 수 없음을 의미합니다. 대신, 그들은 바이트 어레이로 마스킹 된 단단한 메모리 블록 만 볼 수 있습니다. C의 클래스는 구조에 의해 모방되므로 Ploooc는 마스크 구조를 사용하여 클래스를 구현합니다. 예상대로 클래스 소스 코드 만 개인 구성원에게 액세스 할 수 있으며 파생 클래스의 클래스 소스 코드 만 기본 클래스의 보호 된 구성원에게 액세스 할 수 있습니다. 그러나 공개 회원은 모든 사람이 접근 할 수 있습니다.
이것은 어떻게 작동합니까? 당신은 "마스크 구조"라는 용어에서 그것을 추측했을 것입니다. 본질적으로 헤더 파일의 유형 체적 트릭입니다.
이 트릭은 엄격한 유형 확인 컴파일러가 발생할 때까지 잘 작동합니다. 가장 유명한 (또는 악명 높은) 예는 특히 멀티 파일 컴파일 모드가 활성화 된 경우 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을 개선하는 데 3 개월이 걸렸습니다. 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] 수정 클래스 템플릿, 버전 4.6.3
[12/05/2022] 최신 C ++ 언어 버전 4.6.2와의 호환성 향상
[02/01/2022] 힙에 헬퍼 매크로를 추가, 버전 4.6.1
__new_class() 및 __free_class() 를 추가하고 생성자 및 파괴자, 즉 xxxx_init () 및 xxxx_depose () 와 함께 무료로 추가하십시오.[30/12/2021] 개선 된 CMSIS-PAC, 버전 4.6.0
[29/12/2021] CMSIS- 팩 추가, 버전 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
[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에 업로드했습니다
Ploooc 라이브러리는 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. *
* *
****************************************************************************/
| 기준 치수 | 반대자 |
|---|---|
| ploooc.h | Gorgonmeducer |
| plooc_class.h | Gorgonmeducer, Simon Qian |
| plooc_class_strict.h | Gorgonmeducer |
| plooc_class_back_box.h | Gorgonmeducer |
| plooc_class_simple.h | 사이먼 Qian |
| 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));
