1.通常在代码调试过程中为了更好的定位出错的位置信息,需要自定义ASSERT()函数。以下是本人在自我理解的基础上,自定义了ASSERT()函数,具体代码如下:
(1)头文件
#ifndef MY_ASSERT_DEBUG
#define MY_ASSERT_DEBUG 1
#include <stdio.h>
#define MY_DEBUG_TEST
void MyAssertFunction(const char *pFileName,unsigned long lineNum,const char *pFuncName);
#ifdef MY_DEBUG_TEST
#define DEBUG(format,...) printf("Debug Date:%s ,File :%sLine:[%4d] ,Function:%s.\n",__DATE__,__FILE__,\
__LINE__,__FUNCTION__);\
printf(format,##__VA_ARGS__);
#else
#define DEBUG(format,...) printf(format,##__VA_ARGS__);
#endif
#define MY_ASSERT(x) if(x==0)\
MyAssertFunction(__FILE__,__LINE__,__FUNCTION__)
#define FUNC_SUCCESS 1
#define FUNC_FAIL 0
#endif
(2)源文件
//标注头文件引用
#include <stdio.h>
//自定义头文件引用
#include "AssertAndDebug.h"
void MyAssertFunction(const char *pFileName,unsigned long lineNum,const char *pFuncName)
{
printf("ERROR!::%s[%5d]:%s\n",pFileName,lineNum,pFuncName);
}
int TestFunction1()
{
DEBUG("This is TestFucntion1.\n");
return FUNC_FAIL;
}
int main(int argc,char *argv[])
{
DEBUG("This is main function.\n");
MY_ASSERT(TestFunction1());
getchar();
return FUNC_SUCCESS;
}
2.代码解析
(1)自从C99以后,编译器开始支持不定参数的宏定义,例如:#define DEBUG(format,...) printf(format,##__VA_ARGS__)
其中"##"的功能是,如果可变参数被忽略或为空,将使预处理器去掉“##”前面的逗号,以防出错。
(2)ANSI C标准下编译器的内置宏:
__LINE__:获取代码的当前行
__FILE__:获取源文件的名称
__DATE__:获取当前编译日期
__TIME__:获取当前的编译时间
__STDC__:当程序严格遵循ANSI C标准时,该宏定义为1
__cplusplus__:当编译c++程序时,该标识符被定义
编译器编译源代码时,会自动将这些宏替换为相应内容。