OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6659|回复: 7

assert_param(expr) 这句话中expr是什么意思 没有看到哪里定义的

[复制链接]

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-6-25
在线时间
0 小时
发表于 2013-6-16 19:56:29 | 显示全部楼层 |阅读模式
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))语法意思都明白,但是这个expr从哪边冒出来的?是怎么回事的?
请大家知道的回答下啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-16 20:58:30 | 显示全部楼层
我也不懂,帮顶,同求答案,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

163

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2012-4-29
在线时间
38 小时
发表于 2013-6-16 21:30:07 | 显示全部楼层
就是一个带参的宏吧,caller给的啊。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-6-25
在线时间
0 小时
 楼主| 发表于 2013-6-17 21:08:46 | 显示全部楼层
回复【3楼】ilikerome:
---------------------------------
这个我仔细看了看 也算是解释下语句意思  可能我基础还是不太好吧,这种宏定义写法接触不多, #ifdef  DEBUG
#define assert_param(expr) ((expr) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__))
  void assert_failed(uint8_t* file, uint32_t line);
#else
  #define assert_param(expr) ((void)0)
#endif
仔细看了下这种叫被称为断言(这个称呼也不懂)

比如调用这句assert_param(IS_USART_IRDA_MODE(USART_IrDAMode));其中
#define IS_USART_IRDA_MODE(MODE) ((MODE == USART_IrDAMode_LowPower) || \
                                  (MODE == USART_IrDAMode_Normal))也即是后面是判断语句  (0) 或(1)

刚才说的这个IS_USART_IRDA_MODE(USART_IrDAMode)整体宏定义 expr   (不过这种宏定义用法我还不是太能理解,看来我基础还是不行)
此处(expr) 为1表示正确 则由这句话#define assert_param(expr) ((expr) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__))
问题1 这里语句  中(expr)加不加括号有区别吗?(这个比较基础  但是我也不懂问问啊)
知道则强制赋予0即则返回0,不进行任何操作。
如果(expr)为0,则报错,此处assert_failed((uint8_t *)__FILE__, __LINE__)
这个函数用户自己定义可以void assert_failed(uint8_t* file, uint32_t line);
是这个意思吧?


问题2
啊 这个#ifdef  DEBUG
  DEBUG
的预定义是怎么告知系统的  调试的时候  是那个调试软件哪边的吗?
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-18 14:06:57 | 显示全部楼层
加括号可以防止扩展的时候出错啊,比如(a+b)?0:1和a+b?0:1好像就不一样,这得看操作符的优先级。

debug宏可以手动添加,也可以在编译器里设置。
业余程序玩家。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-6-25
在线时间
0 小时
 楼主| 发表于 2013-6-19 15:36:22 | 显示全部楼层
回复【5楼】ofourme:
---------------------------------
哦 ,那这debug 在编译器哪边 怎么传过去的 啊?
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-2-3 13:53:04 | 显示全部楼层
这是断言机制。意思是在关闭断言的情况下,
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
{
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));
  SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);
}
就相当于:
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
{
  (void)0; // 不执行任何操作,对程序也没有副作用
  (void)0; // 不执行任何操作,对程序也没有副作用
  SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);
}
由于你的这个断言没贴完整,我就拿VC++6.0下的断言来说明把。
在VC++6.0下的assert.h中:
#ifdef  NDEBUG 
#define assert(exp)     ((void)0)
#else
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
如果你写的代码中使用了断言,比如:
assert(i>=0);
那么这句的在程序中的作用分两种情况:
1. 若果在assert.h被包含之前NDEBUG这个宏未定义,assert(exp) 就被定义为(void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )。这样当i<0时,i>=0这个表达式为假,所以程序就会终止。并通知程序员发生错误的文件位置和代码行。但是错误信息仅仅对程序员有用。对用户来说,程序异常终止就显得不是那么友好了(用户此时需要的是挽回错误)。所以在发布给用户的程序中,assert(断言)要关闭。在VC++6.0下这是通过在包含assert.h头文件之前定义NDEBUG实现的。
2.在定义了NDEBUG的情况下,断言不应该给程序带来副作用。这样断言就被定义为:
#define assert(exp)     ((void)0)
此时,assert(i>=0);不管括号中表达式为真还是为假,这一行代码其实相当于:
NULL;意思是不执行任何操作。
转自http://zhidao.baidu.com/link?url=GnGUEaHYfFz_YuBozuNQPpgve7LAKV3Cm38SUORu0-xzYnwH0kLepeOvRVuw86ecAOZJphb6HPMxwhFvkYixya
Good good study , day day up...
回复 支持 反对

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-7-16
在线时间
0 小时
发表于 2015-8-4 21:33:48 | 显示全部楼层
回复【7楼】Just Beat It:
---------------------------------
关于#define assert_param(expr)((void)0);
如果参数是0 他会报错   他是怎么实现这个功能的呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-24 11:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表