标签:
本文主要介绍如何利用C标准宏定义(__FILE__, __FUNCTION__, __LINE__)结合assert来更精确的定位导致assert的出错点。尤其在带有深层的函数嵌套调用的复杂程序中,使用__FILE__, __FUNCTION__, __LINE__这3个工具在追踪模糊不清的bug时非常重要。
宏assert的原型定义在头文件<assert.h>中,其作用是如果测试的条件返回错误(即测试等于0),则终止程序执行。 原型定义如下:
#include<assert.h>
Void assert(int expression);
程序清单如下:
/**
* filefcn.h - a function to open files
**/
#ifndef _FILEFCN_H_
#define _FILEFCN_H_
int open_file(FILE** fp, char* fname, char* mode, int line, char* file, char* func);
#endif /**_FILEFCN_H_ */
/**
* filefcn.c - using __FILE__, __FUNCTION__, __LINE__
**/
#include<stdio.h>
#include "filefcn.h"
int open_file(FILE** fp, char* fname, char* mode, int line, char* file, char* func)
{
if((*fp = fopen(fname, mode)) == NULL)
{
fprintf(stderr, "[%s:%s:%d] open_file() failed\n", file, func, line);
return 1;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "filefcn.h"
int main()
{
//printf("Hello world!\n");
FILE* fp;
fp = fopen("foo_bar", "w");
assert(fp);
fclose(fp);
fp = fopen("baz_bar", "r");
/**
* other code
*/
assert(fp);
fclose(fp);
#if 0
/**this call will fail*/
if(open_file(&fp, "foo_bar", "w", __LINE__, __FILE__, __FUNCTION__))
exit(EXIT_FAILURE);
else{
fputs("hello, world\n", fp);
fclose(fp);
}
/** this call will fail*/
if(open_file(&fp, "baz_bar", "r", __LINE__, __FILE__, __FUNCTION__))
exit(EXIT_FAILURE);
else
fclose(fp);
#endif
return 0;
}
运行结果:
说明:
标签:
原文地址:http://www.cnblogs.com/hzwackerman/p/4503469.html