linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用
2013-12-16 09:29
417 查看
在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。
下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。
_FILE__,__FUNCTION__,
__LINE__ 从名字可以直接看出来了,对应的:代码文件名,函数名,
行号。
下面就是定义的宏:
[cpp]
view plaincopyprint?
#define ERROR(...) /
do{ /
fprintf(stderr, "[ERROR ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stderr, __VA_ARGS__); /
}while(0)
#define WARNING(...) /
do{ /
fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define INFO(...) /
do{ /
fprintf(stdout, "[INFO ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define SHOW_TIME(...) /
do{/
extern unsigned long long gLatestTime;/
timeval tp;/
gettimeofday(&tp, NULL);/
unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /
if(gLatestTime != 0) /
{ /
fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/
fprintf(stdout, __VA_ARGS__); /
fprintf(stdout, "/n"); /
} /
gLatestTime = now;/
}while(0)
#ifdef DEBUG
#define DBG(...) /
do{ /
fprintf(stdout, "[DEBUG ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#else
#define DBG(...)
#endif
以上是定义的输出文件信息,如果想输出自定义的字符串(类似printf()的功能),可以使用可变参的形式传递。
如上面的的最后一个DEBUG的定义:
fprintf(stdout , __VA_ARGS__);
这行代码使得用户可以将自己的信息放在可变参里面,例如:DBG(" I am from %s " , "ICT"); 这句话的输出分成两部分,前半部分打印文件名、函数名、行号,后半部分会输出:
I am from ICT 这句话。可变参给用户提供了很好的自定义空间。
<将在下一篇博文中介绍一下" 可变参 "的用法>
说明:
stdout -- 标准输出设备 (printf("..")) 同 stdout。
stderr -- 标准错误输出设备 两者默认向屏幕输出。
但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。
在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。
下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。
_FILE__,__FUNCTION__,
__LINE__ 从名字可以直接看出来了,对应的:代码文件名,函数名,
行号。
下面就是定义的宏:
[cpp]
view plaincopyprint?
#define ERROR(...) /
do{ /
fprintf(stderr, "[ERROR ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stderr, __VA_ARGS__); /
}while(0)
#define WARNING(...) /
do{ /
fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define INFO(...) /
do{ /
fprintf(stdout, "[INFO ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#define SHOW_TIME(...) /
do{/
extern unsigned long long gLatestTime;/
timeval tp;/
gettimeofday(&tp, NULL);/
unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /
if(gLatestTime != 0) /
{ /
fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/
fprintf(stdout, __VA_ARGS__); /
fprintf(stdout, "/n"); /
} /
gLatestTime = now;/
}while(0)
#ifdef DEBUG
#define DBG(...) /
do{ /
fprintf(stdout, "[DEBUG ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /
fprintf(stdout, __VA_ARGS__); /
}while(0)
#else
#define DBG(...)
#endif
#define ERROR(...) / do{ / fprintf(stderr, "[ERROR ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); / fprintf(stderr, __VA_ARGS__); / }while(0) #define WARNING(...) / do{ / fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); / fprintf(stdout, __VA_ARGS__); / }while(0) #define INFO(...) / do{ / fprintf(stdout, "[INFO ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); / fprintf(stdout, __VA_ARGS__); / }while(0) #define SHOW_TIME(...) / do{/ extern unsigned long long gLatestTime;/ timeval tp;/ gettimeofday(&tp, NULL);/ unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; / if(gLatestTime != 0) / { / fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/ fprintf(stdout, __VA_ARGS__); / fprintf(stdout, "/n"); / } / gLatestTime = now;/ }while(0) #ifdef DEBUG #define DBG(...) / do{ / fprintf(stdout, "[DEBUG ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); / fprintf(stdout, __VA_ARGS__); / }while(0) #else #define DBG(...) #endif
以上是定义的输出文件信息,如果想输出自定义的字符串(类似printf()的功能),可以使用可变参的形式传递。
如上面的的最后一个DEBUG的定义:
fprintf(stdout , __VA_ARGS__);
这行代码使得用户可以将自己的信息放在可变参里面,例如:DBG(" I am from %s " , "ICT"); 这句话的输出分成两部分,前半部分打印文件名、函数名、行号,后半部分会输出:
I am from ICT 这句话。可变参给用户提供了很好的自定义空间。
<将在下一篇博文中介绍一下" 可变参 "的用法>
说明:
stdout -- 标准输出设备 (printf("..")) 同 stdout。
stderr -- 标准错误输出设备 两者默认向屏幕输出。
但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。
相关文章推荐
- linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用
- linux 中C语言便于调试的宏定义编写及 __FILE__,__FUNCTION__, __LINE__参数使用
- Linux几个调试宏__FUNCTION__, __TIME__, __LINE__, __FILE__ , __DATA__ 使用
- C语言常用宏定义 __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- Linux几个调试宏_FUNCTION_ _TIME_ _LINE_ _FILE_ _DATA_
- _FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- _FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
- Linux几个调试宏__FUNCTION__ __TIME__ __LINE__ __FILE__ __DATA__
- (转)__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
- Linux几个调试宏__FUNCTION__ __TIME__ __LINE__ __FILE__ __DATA__
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- _FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程
- 可变参数的宏__VA_ARGS__ 及调试常用宏 __FILE__ 、__LINE__、__FUNCTION__
- Linux几个调试宏__FUNCTION__ __TIME__ __LINE__ __FILE__ __DATA__