在C陷阱与缺陷中,实现assert的时候,作者处理的很巧妙,利用逻辑或运算符的特性将这个过程转化为一个表达式,在当条件为假时就会调用_assert_error报错并终止程序。
刚开始_assert_error 的返回值类型是 void 所以在((void)((e) || _assert_error(__FILE__, __LINE__))) 中出现了错误:void 值未如预期地被忽略,虽然exit(-1)并不会强制要求函数的返回值类型,但是在进行void强制忽略的时候就会察觉到这里的异常(具体原因是什么??)。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4
5 #define assert(e) \
6 ((void)((e) || _assert_error(__FILE__, __LINE__)))
7 // { if(!(e)) assert_error(__FILE__, __LINE__); }
8
9 int _assert_error(char *filename, int line){
10 printf("Error ouccurred in %s at line:%d\n", filename, line);
11 exit(-1);
12 }
13
14
15 int main(){
16 int flag = 1;
17 int y = -8;
18 if(flag)
19 assert(y > 0);
20 else printf("hhhhhhhhh\n");
21 printf("%f\n", sqrt(y));
22 // printf("test, %s--%d\n", __FILE__, __LINE__);
23
24 return 0;
25 }
"错误: void 值未如预期地被忽略"解决,布布扣,bubuko.com
原文地址:http://blog.csdn.net/vonzhoufz/article/details/38657311