条件运算符与宏定义的结合问题
2016-09-13 19:08
148 查看
1、 先来个例子
调用如下:
2、 那么,如果两个或多个参量,加入条件运算符如下:
再如之前一样调用,会是什么结果呢?
结果编译没通过,提示:expression must be a modifiable lvalue (表达式必须是一个可修改的左值).
为什么出现这个错误呢?
原来,DATA(n)返回的是*(uint32_t *),亦即把该地址的内容提前返回了,所以,提示错误说左值(即返回的内容)不能修改!
3、 正确的做法是什么样的呢?很简单,只要先选择好地址,再把地址转换成指针即可。最终,DATA(n)等价于*P ,而并没有读取*P的值(内容)。如下:
调用和之前一样。
这样就正确了!
4、 总结一下,这种宏定义比较适用于n个IO口读取n个温度IC的值(比如单总线DS18B20)。
只要知道各个IO口的地址,就能用一套函数,以不同的n值,实现对n个IO口进行读写,以获得n个温度值!
#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个温度值!
相关文章推荐
- dasBlog和空间结合的潜在问题解决
- 关于网友"Flex-Tomcat-MySql"结合的问题!
- Hibernate与Mysql数据库结合乱码问题解决 推荐
- 信息化问题出在管理与技术结合应用上
- List.RemoveAll和List.FindAll结合产生的性能问题之后...
- dwr结合spring例子及出现的相关问题
- Spring MVC与Veclocity结合中文问题及常用中文问题总结
- jstl 结合struts 版本问题 According to TLD or attribute directive in tag file
- datagrid与DataSet结合使用中出现的索引问题
- 问题征解2:SPS与AD(活动目录)结合带来的系统安全性问题
- xml 与javascript结合的问题解决方法
- 做一个项目结合.net和oracle碰到的问题总结
- symfony 结合 smarty 及相关的问题
- xml 与javascript结合的问题解决方法
- xmlhttp,adodb.stream 结合整理 ——代码转换效率问题
- 结合ACCESS数据库开发过程中遇到的问题解决方案(转载)
- [转]其它技术和ColdFusion的结合问题
- datagrid与DataSet结合使用中出现的索引问题
- 解决结合struts 2 与FCKeditor 2.4 时利用FCK的上传功能时出现提示权限不足的问题
- List.RemoveAll和List.FindAll结合产生的性能问题之后...