首页 > 代码库 > 条件运算符与宏定义的结合问题
条件运算符与宏定义的结合问题
1、 先来个例子
#define addr 0x2330000#define DATA (*(uint32_t *)addr)
调用如下:
DATA = http://www.mamicode.com/1;
2、 那么,如果两个或多个参量,加入条件运算符如下:
#define addr0 0x2330000#define addr1 0x2330004#define DATA(n) ((n==0)?(*(uint32_t *)addr0):(*(uint32_t *)addr1))
再如之前一样调用,会是什么结果呢?
DATA(0) = 1;DATA(1) = 1;
结果编译没通过,提示:expression must be a modifiable lvalue (表达式必须是一个可修改的左值).
为什么出现这个错误呢?
原来,DATA(n)返回的是*(uint32_t *),亦即把该地址的内容提前返回了,所以,提示错误说左值(即返回的内容)不能修改!
3、 正确的做法是什么样的呢?很简单,只要先选择好地址,再把地址转换成指针即可。最终,DATA(n)等价于*P ,而并没有读取*P的值(内容)。如下:
#define addr0 0x2330000#define addr1 0x2330004#define DATA(n) (*(uint32_t *)((n==0)?addr0:addr1))
调用和之前一样。
DATA(0) = 1;DATA(1) = 1;
这样就正确了!
4、 总结一下,这种宏定义比较适用于n个IO口读取n个温度IC的值(比如单总线DS18B20)。
只要知道各个IO口的地址,就能用一套函数,以不同的n值,实现对n个IO口进行读写,以获得n个温度值!
条件运算符与宏定义的结合问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。