码迷,mamicode.com
首页 > 其他好文 > 详细

条件运算符与宏定义的结合问题

时间:2016-09-13 20:39:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

1、 先来个例子

#define    addr    0x2330000
#define    DATA    (*(uint32_t *)addr)

  调用如下:

DATA = 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个温度值!

条件运算符与宏定义的结合问题

标签:

原文地址:http://www.cnblogs.com/coolala/p/5869494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!