首页 > 代码库 > [C语言]函数与调试
[C语言]函数与调试
函数与调试
正常程序的调试使用gdb。但有时也会在程序中通过使用printf(),打印关键信息进行bug定位及调试。接下来通过实践不断优化改善:
1,通过在程序中直接使用printf()函数进行开发调试。但在开发调试测试结束后,必须删除相应的调试打印函数(printf)。因为过多的打印函数存在会影响效率,所以上线时会删掉调试打印函数。但这样就导致了生成程序出现bug需测试环境调试定位时,又得重新书写printf进行打印调试。
2,通过使用DEBUG来控制printf函数的调用使用如下:
void test( void ) { /* do something */ #ifdef DEBUG printf("Tets Debug\n"); #endif /* do something */ }
若想打印出printf信息,只要在编译时加入DEBUG选项即可。使用如下:gcc -DDEBUG main.c
此时虽然在DEBUG是已经满足要求,需要调试时才会执行。更不会影响生产线的执行效率。但过多的#ifdef和#endif嵌套会影响代码风格,且会影响可读性。故有了下一版本。
3,使用宏处理。
定义个DEBUG_WRITE宏,在调试状态时指向write_debug函数;非调试状态DEBUG_WRITE定义变成了(void)。
使用stderr而不是stdout的原因是:stderr不存在缓存。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #ifdef DEBUG #define WRITE_DEBUG( arg ) write_debug arg #else #define WRITE_DEBUG( arg ) #endif /** * @brief debug日志信息打印函数 * * @param fmt */ void write_debug( char *fmt, ... ) { va_list vl; va_start( vl, fmt ); vfprintf( stderr, fmt, vl ); va_end( vl ); } int main( int argc, char *argv[] ) { int num = 10; char *str = "szyu"; /* 使用时里面的括号不能省略 */ WRITE_DEBUG( ( "num...%d, str...%s\n", num, str ) ); return 0; }
较之前版本,风格统一且不影响可读性。
本文参考自《征服C指针》
[C语言]函数与调试
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。