C语言#和##连接器在项目中的应用(美观)

看看他是怎么写的:#ifndef RINGBUFF_HDR_H#define RINGBUFF_HDR_H#ifdef __cplusplusextern“ C”; {#endif#include& lt; string.h& gt; #include& ltdstdint.h& gt; / ** * defgroup RINGBUFF环形缓冲区* rief通用环形缓冲区管理器* {* // *- -缓冲区唯一部分开始--- * // ** * rief缓冲区函数/ typedef前缀字符串* *用于零时间更改函数名称,以便在应用程序之间轻松重用同一库。

*使用`#define BUF_PREF(x)my_prefix_ ## x`将所有函数名更改为(例如)`my_prefix_buff_init` * * 注释此宏的修改也必须在头文件和源文件中完成* /#定义BUF_PREF(x)环## x / * ---缓冲区唯一部分结束--- * // ** * rief缓冲区结构* / typedef struct {uint8_t * buff; / *!& lt;缓冲数据的指针。

当`buff!= NULL`和`size` * / size_t size;时,缓冲区被认为是初始化的。

/ *!& lt;缓冲区数据的大小。

实际缓冲区的大小小于值1个字节* / size_t r; / *!& lt;下一步读取指针。

当“ r == w”时,缓冲区被认为是空的;当“ w == r-1”时,缓冲区被认为已满。

/ *!& lt;接下来写指针。

当r == w时,缓冲区被认为是空的;当w == r-1时,缓冲区被认为已满* /} BUF_PREF(buff_t); uint8_t BUF_PREF(buff_init)(BUF_PREF(buff_t)* buff,void * buffdata,size_t size) ; void BUF_PREF(buff_free)(BUF_PREF(buff_t)* buff); void BUF_PREF(buff_reset)(BUF_PREF(buff_t)* buff); / *读/写函数* / size_t BUF_PREF(buff_write)(BUF_PREF(buff_t)* const void * data,size_t btw); size_t BUF_PREF(buff_read)(BUF_PREF(buff_t)* buff,void * data,size_t btr); size_t BUF_PREF(buff_peek)(BUF_PREF(buff_t)* buff,size_t skip_count,void *数据, size_t btp); / *缓冲区大小信息* / size_t BUF_PREF(buff_get_free)(BUF_PREF(buff_t)* buff); size_t BUF_PREF(buff_get_full)(BUF_PREF(buff_t)* buff); / *读取数据块管理* / void * BUF_P (buff_get_linear_block_read_address)(BUF_PREF(buff_t)* buff); size_t BUF_PREF(buff_get_linear_block_read_length)(BUF_PREF(buff_t)* buff); size_t BUF_PREF(buff_skip)(BUF_PREF(buff_t)) ta块管理* / void * BUF_PREF(buff_get_linear_block_write_address)(BUF_PREF(buff_t)* buff); size_t BUF_PREF(buff_get_linear_block_write_length)(BUF_PREF(buff_t)* buff); size_t BUF_PREF(buff_ad),t_BUF_Pance(buff_ad) ; #undef BUF_PREF / *不再需要前缀* // ** *} * /#ifdef __cplusplus}#endif#endif / * RINGBUFF_HDR_H * /去掉,最后阅读代码看到的是非常整齐的:BUF_PREF(buffer_init)BUF_PREF(buff_free)BUF_PREF(buff_write)BUF_PREF(buff_read)等。

接下来看看到底是怎么用的:#define BUF_PREF(x)环## x“ ##”既然知道了原理,那我在之前,你写一个LED驱动或者别的可能是这样的,定义了这么多个函数void led_device_open(void); void led_device_close(void); uint8_t led_device_read(void); uint8_t led_device_write(uint8_t)看起来很统一,我一眼手术这是一个LED的操作方法,但操作一个LED不就是打开,关闭,读,写方法吗?我们可以让它看起来更优雅:#define LED_CLASS(x)led_device_ ## xvoid LED_CLASS(打开)(无效); void LED_CLASS(关闭)(无效); uint8_t LED_CLASS(读取)(无效); uint8_t LED_CLASS(写入)(uint8_t状态);那还是一样的:#define FLASH_CLASS(x)flash_device_ ## xvoid FLASH_CLASS(open)(void); void FLASH_CLASS( close)(void); uint8_t FLASH_CLASS(读取)(void); uint8_t FLASH_CLASS(写入)(uint8_t状态);看起来舒服多了!那么##和#又有什么区别呢?##刚刚已经说了,是黏贴字符串而#表示的是将参数转换为字符串下面写一个跟#相关的例子:#include& lt; stdio .h& gt; #define Print(x)printf(“%s%d "#x,x); int main(void){Print(100); return 0;}运行结果:公众号粉丝福利时刻这里我给大家申请到了福利,本公众号读者购买小熊派发开发板可享受9折优惠,有需要购买小熊派的朋友,淘宝搜索即可,跟客户说你是公众号:嵌入式云IOT技术圈的粉丝,立享9折优惠!往期精彩

产品知识/行业、品牌资讯