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=num
exp=123: string-exp=123
i'm here! file:d:\projects\vs2015\剑指offer\第一章\第一章\源.cpp line:10