使用 C 模仿 C++ 模板的拙劣方法

如下所示,準備兩個宏,一個定義類型,一個定義容器大小。
使用時只要先定義這兩個宏,然后再包含容器頭文件就能生成不同類型和大小的容器了。但是這種方法只允許在源文件中使用,如果在頭文件中使用,定義不同類型和大小的容器時會引起宏定義沖突。

#pragma once
#include "cb/cb_define.h"
#include <stdbool.h>
#include <stdint.h>
#include <string.h>#ifdef __cplusplus
extern "C"
{
#endif////// @brief 模板參數。隊列元素類型。///
#ifndef __template_cb_circle_deque_element_type#define __template_cb_circle_deque_element_type int
#endif////// @brief 模板參數。隊列大小。///
#ifndef __template_cb_circle_deque_size#define __template_cb_circle_deque_size 100
#endif////// @brief 循環隊列。///typedef struct cb_circle_deque{__template_cb_circle_deque_element_type _buffer[__template_cb_circle_deque_size];uint32_t _begin;uint32_t _end;bool _is_full;} cb_circle_deque;////// @brief 初始化。////// @param self/// @return///__cb_force_inline void cb_circle_deque_initialize(cb_circle_deque *self){self->_begin = 0;self->_end = 0;self->_is_full = false;}////// @brief 隊列中的元素個數。////// @param self/// @return///__cb_force_inline int cb_circle_deque_count(cb_circle_deque *self){if (self->_is_full){return __template_cb_circle_deque_size;}if (self->_end >= self->_begin){return self->_end - self->_begin;}return __template_cb_circle_deque_size - (self->_begin - self->_end);}////// @brief 隊列為空。////// @param self/// @return///__cb_force_inline bool cb_circle_deque_is_empty(cb_circle_deque *self){return self->_begin == self->_end && !self->_is_full;}////// @brief 向隊列末尾添加元素。////// @param self/// @param value/// @return 添加成功返回 true, 添加失敗返回 false.///__cb_force_inline bool cb_circle_deque_push_back(cb_circle_deque *self,__template_cb_circle_deque_element_type *value){if (value == NULL){return false;}if (self->_is_full){return false;}self->_buffer[self->_end] = *value;self->_end = (self->_end + 1) % __template_cb_circle_deque_size;if (self->_end == self->_begin){self->_is_full = true;}return true;}////// @brief 向隊列頭部添加元素。////// @param self/// @param value/// @return 添加成功返回 true, 添加失敗返回 false.///__cb_force_inline bool cb_circle_deque_push_front(cb_circle_deque *self,__template_cb_circle_deque_element_type *value){if (value == NULL){return false;}if (self->_is_full){return false;}self->_begin = (self->_begin + __template_cb_circle_deque_size - 1) % __template_cb_circle_deque_size;self->_buffer[self->_begin] = *value;if (self->_end == self->_begin){self->_is_full = true;}return true;}////// @brief 彈出隊列末尾元素。////// @param self/// @param out/// @return///__cb_force_inline bool cb_circle_deque_pop_back(cb_circle_deque *self,__template_cb_circle_deque_element_type *out){if (cb_circle_deque_is_empty(self)){return false;}self->_end = (self->_end + __template_cb_circle_deque_size - 1) % __template_cb_circle_deque_size;if (out != NULL){*out = self->_buffer[self->_end];}self->_is_full = false;return true;}////// @brief 彈出隊列頭部元素。////// @param self/// @param out/// @return///__cb_force_inline bool cb_circle_deque_pop_front(cb_circle_deque *self,__template_cb_circle_deque_element_type *out){if (cb_circle_deque_is_empty(self)){return false;}if (out != NULL){*out = self->_buffer[self->_begin];}self->_begin = (self->_begin + 1) % __template_cb_circle_deque_size;self->_is_full = false;return true;}////// @brief 獲取隊列中指定索引的元素。////// @param self/// @param index////// @return 如果指定索引處有元素,則返回該元素的指針,否則返回空指針。///__cb_force_inline __template_cb_circle_deque_element_type *cb_circle_deque_get(cb_circle_deque *self,int index){if (index < 0 || index >= cb_circle_deque_count(self)){return NULL;}uint32_t pos = (self->_begin + index) % __template_cb_circle_deque_size;return &self->_buffer[pos];}////// @brief 清空隊列。////// @param self/// @return///__cb_force_inline void cb_circle_deque_clear(cb_circle_deque *self){self->_begin = 0;self->_end = 0;self->_is_full = false;}#ifdef __cplusplus
}
#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921031.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flume接收處理器:構建高可用與高性能的數據鏈路

flume接收處理器&#xff1a;構建高可用與高性能的數據鏈路 在大規模數據采集場景中&#xff0c;單點故障和性能瓶頸是兩大核心挑戰。Flume 通過 Sink Group 接收處理器&#xff08;Processor&#xff09; 機制&#xff0c;提供了強大的故障轉移&#xff08;Failover&#xf…

高級Kafka應用之流處理

40 Kafka Streams與其他流處理平臺的差異在哪里&#xff1f; 什么是流處理平臺&#xff1f; “Streaming Systems”一書是這么定義“流處理平臺”的&#xff1a;流處理平臺&#xff08;Streaming System&#xff09;是處理無限數據集&#xff08;Unbounded Dataset&#xff09;…

Custom SRP - LOD and Reflections

1 LOD Groups 場景中對象越多,場景就越豐富,但是過多的對象,也會增加 CPU 和 GPU 的負擔.同時如果對象最終渲染在屏幕上后覆蓋的像素太少,就會產生模糊不清的像素點/噪點.如果能夠不渲染這些過小的對象,就能解決噪點問題,同時釋放 CPU GPU,去處理更重要的對象. 裁剪掉這些對象…

【Linux篇章】互聯網身份密碼:解密 Session 與 Cookie 的隱藏玩法和致命漏洞!

本篇摘要 本篇將承接上篇HTTP講解&#xff08; 戳我查看 &#xff09;遺留的關于Cookie與Session的介紹&#xff0c;在本篇&#xff0c;將會介紹Cookie的由來&#xff0c;作用&#xff0c;以及缺點等&#xff0c;進而引出Session&#xff0c;最后介紹一下它們的性質等&#xf…

Postman接口測試工具:高效管理測試用例與環境變量,支持斷言驗證及團隊協作同步

之前跟你們聊過能搭知識網絡的 Obsidian&#xff0c;今天換個偏向接口測試的方向 —— 給你們安利一個 Github 上的「Postman」&#xff0c;它是個接口測試工具&#xff0c;官網能直接下載&#xff08;Postman: The Worlds Leading API Platform | Sign Up for Free&#xff09…

可可圖片編輯 HarmonyOS 上架應用分享

可可圖片編輯 HarmonyOS 上架應用分享 介紹 可可圖片編輯 原名 圖片編輯大師&#xff0c;因為上架審核的時候 &#xff0c;提示與一些已有應用重名&#xff0c;為了避免沖突&#xff0c;需要改名字&#xff0c;所以苦心思考了一分鐘&#xff0c;就調整成 可可圖片編輯。 應用…

Notepad++近期版本避雷

近期Notepad若干版本存在投毒事件&#xff0c;雖然也歡迎大家使用替代軟件&#xff0c;但是Notepad作為一款開源軟件&#xff0c;如有需要也可以繼續白嫖使用&#xff0c;但是請務必避開若干埋雷版本&#xff01; 經檢查&#xff0c;部分版本在幫助菜單中加入了有關tw的部分個人…

【lucene核心】impacts的由來

在 Lucene 的 Impact 概念&#xff08;出現在 ImpactsEnum / Impact 對象里&#xff09;中&#xff1a;字段 含義 freq 當前 term 在該文檔中出現了多少次&#xff08;即詞頻 term frequency&#xff09;。 norm 當前 文檔在該字段中的長度因子&#xff08;即之前 norms 里保存…

基于Echarts+HTML5可視化數據大屏展示-惠民服務平臺

效果展示代碼結構&#xff1a;主要代碼實現 index.html布局 <!doctype html> <html><head><meta charset"utf-8"><title>雙數智慧公衛-傳染病督導平臺</title><meta http-equiv"refresh" content"60;urlhttps…

【Flink】DataStream API:執行環境、執行模式、觸發程序執行

目錄執行環境getExecutionEnvironmentcreateLocalEnvironmentcreateRemoteEnvironment執行模式流執行模式&#xff08;Streaming&#xff09;批執行模式&#xff08;Batch&#xff09;自動模式&#xff08;AutoMatic&#xff09;觸發程序執行DataStream API是Flink的核心層API&…

CentOS7.6

騰訊云服務器 騰訊云 產業智變云啟未來 - 騰訊 服務器在控制臺顯示 點擊進入面板&#xff0c;顯示所有信息 現在來安裝桌面的遠程控制軟件 寶塔SSH終端:一款同時支持SSH和SFTP客戶端的免費軟件! 點擊立即下載 在云服務器的實例列表復制公網ip 密碼就是服務器的密碼&#xff…

前端架構知識體系:常見圖片格式詳解與最佳實踐

前端開發必備&#xff1a; 在前端開發中&#xff0c;合理選擇圖片格式直接影響網頁加載性能、用戶體驗和帶寬成本。本文將系統梳理常見圖片格式&#xff0c;分析它們的優缺點、壓縮原理、兼容性和推薦使用場景&#xff0c;并提供前端優化實戰建議。1. JPEG / JPG 全稱&#xff…

ARM的編程模型

ARM的編程模型 ARM 的編程模型指的是從程序員&#xff08;特別是匯編程序員和編譯器設計者&#xff09;視角所看到的 ARM 處理器架構。它定義了程序員可以使用的資源、數據操作方式以及規則&#xff0c;主要包括&#xff1a;寄存器組、數據類型、內存訪問方式、執行狀態和異常處…

最大熵強化學習相比傳統強化學習,有什么缺點?

要理解最大熵強化學習&#xff08;MaxEnt RL&#xff09;相比傳統強化學習&#xff08;如DQN、PPO、DDPG等&#xff09;的缺點&#xff0c;首先需要明確兩者的核心差異&#xff1a;傳統RL的目標是“最大化累積獎勵”&#xff0c;而MaxEnt RL在該目標基礎上額外增加了“最大化策…

python生成器與協程深度剖析

目錄 生成器 傳統列表 vs 生成器對比 yield機制深度解析 生成器的高級用法 協程的演進:從yield到async/await 基于yield的協程 現代async/await語法 協程的錯誤處理和超時控制 異步生成器與異步迭代器 異步生成器 異步迭代器實現 實戰案例:異步爬蟲框架設計 生成器…

論文解讀:基于 77 GHz FMCW 毫米波雷達的艙內占位檢測

毫米波 (mm-Wave) 雷達是汽車應用&#xff08;例如高級駕駛輔助系統 (ADAS)&#xff09;的一種解決方案。本研究探索了商用毫米波雷達技術在車內應用領域的應用。本文提出了一種基于 77 GHz 毫米波雷達的車輛占用檢測器框架。本研究采用了德州儀器 (Texas Instruments) 的多輸入…

進程優先級(Process Priority)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

OpenCV的輪廓檢測

1. 輪廓檢測的基本概念輪廓是圖像中連續的、閉合的曲線段&#xff0c;代表物體的邊界&#xff08;如圓形的輪廓是一條閉合曲線&#xff09;。OpenCV 的輪廓檢測通過 cv2.findContours() 實現&#xff0c;可用于形狀識別、物體計數、圖像分割等場景。2. 核心函數與參數&#xff…

亞信安全亮相鴻蒙生態大會2025 攜手鴻蒙生態繪就萬物智聯新藍圖

8 月30 日&#xff0c;以 “新場景?新體驗” 為主題的鴻蒙生態大會 2025 在深圳福田會展中心隆重開幕。本次大會由全球智慧物聯網聯盟&#xff08;GIIC&#xff09;主辦、鴻蒙生態服務&#xff08;深圳&#xff09;有限公司承辦&#xff0c;旨在搭建全球鴻蒙生態伙伴的高層次交…

Linux內核進程管理子系統有什么第四十回 —— 進程主結構詳解(36)

接前一篇文章&#xff1a;Linux內核進程管理子系統有什么第三十九回 —— 進程主結構詳解&#xff08;35&#xff09; 本文內容參考&#xff1a; Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇&#xff1a;第三部分 進程管理》—— 劉超 《…