如下所示,准备两个宏,一个定义类型,一个定义容器大小。
使用时只要先定义这两个宏,然后再包含容器头文件就能生成不同类型和大小的容器了。但是这种方法只允许在源文件中使用,如果在头文件中使用,定义不同类型和大小的容器时会引起宏定义冲突。

#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;第三部分 进程管理》—— 刘超 《…