C语言中的 (void*)0 与 (void)0
来源:互联网 发布:投资公司的网络销售 编辑:程序博客网 时间:2024/05/16 03:12
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
代码的含意简单, 关键是那个 (void)0 的用法, 我还是第一次见到(别笑).
我用 void 的时候, 有两种情况:
1.放到函数前面, 强调函数没有返回值, 也就是说函数不能作右值
如: void fun(int x);
2.放到函数形参里面, 强调函数无任何参数
如: int fun(void);
还有一种用法是:
#define NULL ((void*)0)
当然, 这就是NULL空指针的定义方式(在 stdlib.h 里面).
可, 上面宏的 (void)0, 一开始确实让我觉得有点奇怪, 不知道干嘛的, 平静下来, 想了想.
原来,宏里面这样用的目的是防止该宏被用作右值, (void)0 本身也不能作右值, 因为 void 非实际的类型!
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;
在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。
所谓有效的参数是指满足规定范围的参数,比如某个参数的取值范围只能是小于3的正整数,如果给出的参数大于3,
则这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,而不必等到程序运行结果的错误而大费周折。
这是一种常见的软件技术,可以在调试阶段帮助程序员快速地排除那些明显的错误。
它确实在程序的运行上牺牲了效率(但只是在调试阶段),但在项目的开发上却帮助你提高了效率。
当你的项目开发成功,使用release模式编译之后,或在stm32f10x_conf.h文件中注释掉对USE_FULL_ASSERT的宏定义,所有的assert_param()检验都消失了,不会影响最终程序的运行效率。
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
。。。
assert_param(IS_ADC_ALL_PERIPH(ADCx));
。。。
在执行assert_param()的检验时,如果发现参数出错,它会调用函数assert_failed()向程序员报告错误,在任何一个例程中的main.c中都有这个函数的模板,如下:
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{}
}
你可以按照自己使用的环境需求,添加适当的语句输出错误的信息提示,或修改这个函数做出适当的错误处理。
- C语言中的 (void*)0 与 (void)0
- C语言中的 (void*)0 与 (void)0
- C语言中的 (void*)0 与 (void)0
- C语言中的 (void*)0 与 (void)0
- C语言中的 void*
- C表达式((void (*)(void))0();
- c/c++ 中的void 与void *区别
- 【转】C语言声明((void ()( ) )0)( )
- C/C++语言中的void及void指针类型
- C/C++语言中的void及void指针类型
- C/C++语言中的void及void指针类型
- C语言中的void 和void 指针类型
- C/C++语言中的void及void指针总结
- C/C++语言中的void及void指针总结
- C/C++语言中的void及void指针总结
- C语言中的void 和void 指针类型
- C语言中的void 和void 指针类型
- void(0) 与 #
- hexo YAMLException: cannot read a block mapping entry; a multi line key may not be an implicit key a
- 实现pow函数
- 2017年8月18日模拟9(smoj2218、2044、2103,动态规划,动态规划、树链剖分)
- Mybatis学习(六)mybatis与hibernate区别与应用场景
- 21. Merge Two Sorted Lists
- C语言中的 (void*)0 与 (void)0
- 设计模式---构造者模式
- CODECHEF Palindromic Game
- C++中 atexit函数 exit函数
- JetBrains正式发布Kotlin 1.0:JVM和Android上更好用的语言
- python爬虫上手 笔记<4>
- Markdown的一些语法(好难记啊QAQ)
- mvc、mvp 和mvvm区别
- 【广告项目】STS实现SVN账户轻松切换