[MCU开发工具资源区] 条件运算符与宏定义的结合

[复制链接]
 楼主| pixhw 发表于 2025-7-28 15:54 | 显示全部楼层 |阅读模式
1、 先来个例子

#define    addr    0x2330000
#define    DATA    (*(uint32_t *)addr)
  调用如下:

DATA = 1;


2、 那么,如果两个或多个参量,加入条件运算符如下:

  1. #define    addr0    0x2330000

  2. #define    addr1    0x2330004



  3. #define    DATA(n)    ((n==0)?(*(uint32_t *)addr0):(*(uint32_t *)addr1))

  再如之前一样调用,会是什么结果呢?

  1. DATA(0) = 1;

  2. DATA(1) = 1;

  结果编译没通过,提示:expression must be a modifiable lvalue (表达式必须是一个可修改的左值).

  为什么出现这个错误呢?

  原来,DATA(n)返回的是*(uint32_t *),亦即把该地址的内容提前返回了,所以,提示错误说左值(即返回的内容)不能修改!



3、 正确的做法是什么样的呢?很简单,只要先选择好地址,再把地址转换成指针即可。最终,DATA(n)等价于*P ,而并没有读取*P的值(内容)。如下:

  1. #define    addr0    0x2330000

  2. #define    addr1    0x2330004



  3. #define    DATA(n)    (*(uint32_t *)((n==0)?addr0:addr1))

  调用和之前一样。

  1. DATA(0) = 1;

  2. DATA(1) = 1;

  这样就正确了!



4、 总结一下,这种宏定义比较适用于n个IO口读取n个温度IC的值(比如单总线DS18B20)。

  只要知道各个IO口的地址,就能用一套函数,以不同的n值,实现对n个IO口进行读写,以获得n个温度值!

kmzuaz 发表于 2025-8-4 11:19 | 显示全部楼层
条件表达式 ? 表达式1 : 表达式2
wilhelmina2 发表于 2025-8-4 20:41 | 显示全部楼层
宏定义使用#define预处理器指令,允许在编译前替换特定的文本。宏可以定义常量、函数式宏等。
geraldbetty 发表于 2025-8-4 21:39 | 显示全部楼层
可以通过宏定义来控制条件运算符中的条件表达式,从而在编译时决定代码的行为。
everyrobin 发表于 2025-8-5 10:14 | 显示全部楼层
条件运算符(也称为三元运算符)和宏定义在C语言中经常结合使用,以实现简洁且高效的代码。
lzbf 发表于 2025-8-5 12:49 | 显示全部楼层
使用条件运算符和宏定义时,要注意参数可能有副作用。例如,如果参数是一个带有副作用的表达式(如 i++),可能会导致意外的结果。
hudi008 发表于 2025-8-7 11:28 | 显示全部楼层
通过宏参数控制条件运算符的行为,实现更灵活的代码生成。
timfordlare 发表于 2025-8-7 14:37 | 显示全部楼层
将条件运算符嵌入宏体中,利用宏参数或全局变量作为条件,实现动态逻辑选择。
sesefadou 发表于 2025-8-7 16:50 | 显示全部楼层
可通过 #define 定义带参数的宏,模拟函数行为
xiaoyaodz 发表于 2025-8-8 12:03 | 显示全部楼层
在宏定义中,为了防止运算符优先级问题,通常会给参数和整个表达式加上括号。
sdCAD 发表于 2025-8-8 14:05 | 显示全部楼层
条件运算符与宏的结合逻辑​              
updownq 发表于 2025-8-8 16:05 | 显示全部楼层
宏定义在预处理阶段进行文本替换,可能会导致意外的展开结果。使用宏时要确保参数被正确括起来,以避免优先级问题。
jackcat 发表于 2025-8-10 20:51 | 显示全部楼层
简单逻辑用宏,复杂逻辑用函数              
sanfuzi 发表于 2025-8-11 20:13 | 显示全部楼层
避免在宏参数中使用自增/自减等有副作用的表达式。
qiufengsd 发表于 2025-8-11 23:14 | 显示全部楼层
条件运算符的语法是 ? :,它允许在一行代码中实现简单的条件判断。宏定义则通过预处理器在编译前替换代码,从而提高代码的可读性和复用性。
51xlf 发表于 2025-8-12 02:18 | 显示全部楼层
代码简洁,避免函数调用              
olivem55arlowe 发表于 2025-8-12 05:20 | 显示全部楼层
可以使用宏定义来封装条件运算符,以便在代码中多次使用相同的条件逻辑。
everyrobin 发表于 2025-8-12 12:45 | 显示全部楼层
在硬件配置中,常需根据不同型号或模式选择参数(如波特率、GPIO 引脚),结合条件运算符的宏可避免冗余的if-else。
loutin 发表于 2025-8-12 16:13 | 显示全部楼层
通过宏将条件运算符的逻辑封装,使代码更简洁,避免重复编写if-else语句。
adolphcocker 发表于 2025-8-12 18:26 | 显示全部楼层
虽然宏定义可以使代码更简洁,但过度使用宏可能会降低代码的可读性。因此,要权衡简洁性和可读性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

4917

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部