#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行啥操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行啥操作相关的知识,希望对你有一定的参考价值。
具体的定义和用法在下面
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)
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;意思是不执行任何操作。 参考技术A T这东西一般是用来记录系统日志什么的,调试辅助用的,判断表达式是否在正常范围里,不是的话进行日志记录,调用时一般会打印到控制台上或是日志文件里,方便调试用,__FILE__是当前调用这个函数的文件,__LINE__指明调用所在的行数,可以很方便地定位到相关位置 参考技术B ((void)0) 可以把0转换成所需的任何类型
以上是关于#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行啥操作的主要内容,如果未能解决你的问题,请参考以下文章
#define assert_param(expr) ((void)0) 这是个宏定义,但是我真是不知道(void)0能执行啥操作
STM32里面的一些小函数——assert_param,PUTCHAR_PROTOTYPE