×

C ---------- 使用#define定义一个带参数的宏,注意事项

C语言学习

C ---------- 使用#define定义一个带参数的宏,注意事项

zxjy辉 zxjy辉 发表于2023-12-11 浏览1774 评论0

应避免使用使用宏定义 带参数的表达式,因为会导致多次求值,导致结果和预期不符


例如 #define max(a,b)  (a)>(b)?a:b

上述的这个宏定义带参表达式,在使用带有++,--方式时,就会导致重复求值,该表达式,一共进行两次求值,一次是在判断 a是否大于b,另一次则是,输出max(a,b)结果的时候

举个例子

C语言学习

C ---------- #define 与 typedef 的区别

zxjy辉 zxjy辉 发表于2023-12-11 浏览1508 评论0

区别还是挺大的,要注意辨别,尤其是在多个变量的时候


都可以用来定义一个别名,

#define otherName  Name

typedef Name otherName;

区别在于,多个变量定义的时候,尤其在定义指针的时候

#define D_otherName Name*

typedef Name*  T_otherName;

例如:

D_otherName a,b;    这个扩展为: Name *a,b; 在这里 a变量表示指针,而b变量则不是指针

C ---------- 关于结构体全是指针,整体进行赋值,导致数据错误

C语言学习

C ---------- 关于结构体全是指针,整体进行赋值,导致数据错误

zxjy辉 zxjy辉 发表于2023-10-08 浏览1820 评论0

未知的错误(?),解决了但是又好像没解决


  1. 通过结构体整体赋值的方式,可能是由于空间分配不足的问题,导致数据错误,在结构体中添加了一个有具体大小的数组,数据不产生错误,在图2中,就是直接将数据进行赋值,然后出现莫名的错误,由于之前的出现过相似的问题,果然,在图1中加入一个有具体大小的数组,错误就消失了

ESP32------关于蓝牙的使用的基础了解

ESP32_学习之旅

ESP32------关于蓝牙的使用的基础了解

zxjy辉 zxjy辉 发表于2023-08-15 浏览1729 评论0

这个蓝牙的使用,主要是在应用层上,也就是需要我们去调用对应的api接口去打开蓝牙,广播或则是扫描,这些都有对应的回调函数(gap事件回调和gatt事件回调,需要注意的是,这些回调函数都是底层事件执行完之后,才会在应用层回调),用来处理对应的蓝牙状态,例如说,我在应用层上打开蓝牙,然后这个指令层层下发,蓝牙打开成功后,就会有一个在应用层上对应的回调函数,进行处理,然后可以将之通过串口打印出来,就可以得知蓝牙打开成功。

ESP32------关于软件I2C的移植

ESP32_学习之旅

ESP32------关于软件I2C的移植

zxjy辉 zxjy辉 发表于2023-07-14 浏览371 评论0

这个可真的挖了一个坑,把我埋进去了,原本是用硬件I2C的,毕竟esp32 自带了两个I2C控制器,这样比较方便,但是我发现我手中,有一款oled,使用esp32,无法查找到对应设备地址,但是,使用商家给的stm32代码,是可以直接驱动的,说明屏幕没有问题;于是我就用另一款oled,接入esp32,是可以查找到对应的地址,这就很尴尬了,(这难道就是硬件I2C的缺点? 因为有的设备可以通过写,然后查找到对用的设备地址,有的需要先读再写,才能读到设备地址。参考链接: