环境
C99以上
说明
##__VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持,宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错。
__FILE__宏是一个当前文件字符串
__LINE__宏在预编译时会替换成当前的行号
__FUNCTION__宏在预编译时会替换成当前的函数名称
先用类包装一个文件指针方便写日志宏
头文件
class CLog
{
public:
static bool Init()
{
if(!fp)
{
fp = fopen(szFileName, "w");
}
return fp == NULL ? FALSE : TRUE;
}
static void UnInit()
{
if(fp)
{
fclose(fp);
fflush(fp);
fp = NULL;
}
}
static FILE* GetHandle()
{
return fp;
}
private:
static char szFileName[1024];
static FILE* fp;
};
char CLog::szFileName[1024] = "D:\\1.txt"; //日志输出的目录
FILE* CLog::fp = NULL;
日志宏
//日志输出到文件中
#define DEBUG_LOG_FILE(fmt, ...) do{FILE* fp = CLog::GetHandle();\
char szLog[2408] = {0};\
char szLogPre[1024] = {0};\
sprintf_s(szLogPre, 1024, "[DEBUG][%s][%s][%d]",__FILE__, __FUNCTION__, __LINE__);\
sprintf_s(szLog, 2408, "%s:"fmt, szLogPre, ##__VA_ARGS__);\
fprintf_s(fp, szLog);\
fflush(fp);}while(0);
//日志输出到debugview中
#define DEBUG_LOG(fmt,...) do{char szLog[2408] = {0};\
char szLogPre[1024] = {0};\
sprintf_s(szLogPre, 1024, "[DEBUG][%s][%s][%d]",__FILE__, __FUNCTION__, __LINE__);\
sprintf_s(szLog, 2408, "%s:"fmt, szLogPre, ##__VA_ARGS__);\
OutputDebugStringA(szLog);}while(0);
//示例
int main()
{
CLog::Init(); //
//....
DEBUG_LOG_FILE("%s %d", "测试", 123); //将日志信息写入文件
DEBUG_LOG("%s %d", "测试", 123); //输出debug日志信息
//....
CLog::UnInit();
return 0;
}