Assert()

来源:互联网 发布:java excel 小数 4位 编辑:程序博客网 时间:2024/06/16 16:47

Assert()

http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
这是实现方法的代码:
#define ASSERT(exp) (void)((exp)||(_assert(#exp,FILE,LINE),0))
void _assert(void * exp, void * file, unsigned int line)
{
printf(“Assertion failed: %s, file %s, line %d\n”,exp,file,line);
abort();
}

下面提问不懂的地方:
1
#define ASSERT(exp) (void)((exp)||(_assert(#exp,FILE,LINE),0))
中的void是什么意思??
2
#define ASSERT(exp) (void)((exp)||(_assert(#exp,FILE,LINE),0))
中的(_assert(#exp,FILE,LINE),0)是什么意思??0和_assert()函数之间想实现什么运算吗??
3
_assert(#exp,FILE,LINE)中的三个参数分别什么意思??能给具体点解释吗??
4
void _assert(void * exp, void * file, unsigned int line)中的void* 是什么意思?可以理解为指向任何形式的指针吗????
5
printf(“Assertion failed: %s, file %s, line %d\n”,exp,file,line);
我不懂”Assertion failed: %s, file %s, line %d\n”
引号内的文字应该是直接输出的,为什么最终会代表出错的位置呢

问题解答:
_assert(#exp,FILE,LINE)中的三个参数分别什么意思??能给具体点解释吗??
3.1 #exp 意思是将exp所代表的信息转换成一个串
3.2
FILE,LINE 是C标准中的两个宏
FILE 此语句所在的源文件名
LINE 此语句所在的源文件的行值
自己通过以下程序对体会一下
#define PRT(exp) printf(“exp=%d: string-exp=%s\n” , exp , #exp );
int main()
{
int num=100;
PRT( num )
PRT( 123 )
printf(“i’m here! file:%s line:%d\n” , FILE,LINE );
return 0;
}
4
void _assert(void * exp, void * file, unsigned int line)中的void* 是什么意思?可以理解为指向任何形式的指针吗?
应该是理解为:任意 类型 的指针
5
printf(“Assertion failed: %s, file %s, line %d\n”,exp,file,line);
我不懂”Assertion failed: %s, file %s, line %d\n”引号内的文字应该是直接输出的,为什么最终会代表出错的位置呢
见3说明
1
#define ASSERT(exp) (void)((exp)||(_assert(#exp,FILE,LINE),0))
中的void是什么意思??
void的意思是 ASSERT(exp) 语句没有返回值!当然,这里不加 (void) 也没有问题,abort();
会中断程序
2
#define ASSERT(exp) (void)((exp)||(_assert(#exp,FILE,LINE),0))
中的(_assert(#exp,FILE,LINE),0)是什么意思??0和_assert()函数之间想实现什么运算吗??
是的,因为_assert()函数没有返回值,(exp)一定会返回0或非0,一个数值与一个void(这里理解为没有的意思)不能运算||,所以,采用逗号运算,让(_assert(#exp,FILE,LINE),0)的结果为0(当然写成任意数都可以,只要有个值就行),这样就不会有编译、运行上的问题了

运行结果:

#include<iostream>#include <assert.h>using namespace std;#define PRT(exp) printf("exp=%d: string-exp=%s\n" , exp , #exp );int main(){    int num = 100;    PRT(num)    PRT(123)    printf("i'm here! file:%s line:%d\n", __FILE__, __LINE__);    return 0;}
exp=100: string-exp=numexp=123: string-exp=123i'm here! file:d:\projects\vs2015\剑指offer\第一章\第一章\源.cpp line:10
0 0
原创粉丝点击