函数与调试

正常程序的调试使用gdb。但有时也会在程序中通过使用printf(),打印关键信息进行bug定位及调试。接下来通过实践不断优化改善:

1,通过在程序中直接使用printf()函数进行开发调试。但在开发调试测试结束后,必须删除相应的调试打印函数(printf)。因为过多的打印函数存在会影响效率,所以上线时会删掉调试打印函数。但这样就导致了生成程序出现bug需测试环境调试定位时,又得重新书写printf进行打印调试。

2,通过使用DEBUG来控制printf函数的调用使用如下:

void test( void )
{/* do something */
#ifdef DEBUGprintf("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指针》

转载于:https://blog.51cto.com/11998200/1861287

[C语言]函数与调试相关推荐

  1. 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. 脑动力:C语言函数速查效率手册(附DVD光盘1张) [平

    脑动力:C语言函数速查效率手册(附DVD光盘1张) [平 本书全面.系统地介绍了C语言的库函数.C语言是基础的通用程序设计语言,许多语言都是从C语言基础上发展起来的,C语言库函数可以使编程更加高效便捷 ...

  3. 利用反汇编手段解析C语言函数

    利用反汇编手段解析C语言函数 通过在 Visual C++6.0 下反汇编一个 32 位 C语言程序的部分代码来解析解释函数调用的具体过程. 函数调用过程 函数调用过程主要由参数传递.地址跳转.局部变 ...

  4. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  5. C语言 函数不定长参数 ##__VA_ARGS__经典案例 - C语言零基础入门教程

    目录 一.##__VA_ARGS__简介 二.##__VA_ARGS__经典案例 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.## ...

  6. C语言函数一章教学,C语言-第1章教学案.doc

    C语言-第1章教学案 第一章 前言 本章重点 1.了解C语言的产生.发展.特点:::1.了解C语言的产生.发展.特点:2.掌握C语言的基本结构:3.掌握C语言源程序的调试运行过程:第一3.C语言的产生 ...

  7. 第05章 Go语言函数(Go语言func)

    函数是组织好的.可重复使用的.用来实现单一或相关联功能的代码段,其可以提高应用的模块性和代码的重复利用率. Go 语言支持普通函数.匿名函数和闭包,从设计上对函数进行了优化和改进,让函数使用起来更加方 ...

  8. Linux(Ubuntu)下C语言编译与调试

    Linux(Ubuntu)下C语言编译与调试 编译流程 gcc安装命令 sudo apt install build-essential vim/touch 创建源文件 vim打开编辑源文件(.c结尾 ...

  9. C语言函数大全-- l 开头的函数

    C语言函数大全 本篇介绍C语言函数大全-- l 开头的函数 1. labs,llabs 1.1 函数说明 函数声明 函数功能 long labs(long n); 计算长整型的绝对值 long lon ...

最新文章

  1. 使用MVVM绑定AppBar事件
  2. 第11章 支撑向量机SVM
  3. 宏观经济之国家经济与建设
  4. python安装多少位_python安装流程
  5. 30多门免费课程上线,亚马逊“机器学习大学”开学了
  6. Jquery的load加载本地文件出现跨域错误的解决方案
  7. java 代码走查_代码走查检查表(JAVA).doc
  8. M2Det 论文笔记
  9. IBM x3850 x5U盘启动或光驱启动不起作用
  10. 日文翻译器支持整篇文档批量翻译
  11. 天涯百宝箱功能的js脚本--只看楼主
  12. PHP项目汇报ppt模板,免费工作汇报模板(课堂PPT)
  13. 上海社保基数又上涨,对积分、落户有什么影响?
  14. 软件里的alpha版和beta版是什么意思?
  15. 各种说明方法的例句_句子的说明方法有哪些(说明方法的句子大全集)
  16. 速读原著-TCP/IP(子网寻址)
  17. 三菱Q系列PLC数据采集随笔
  18. Flask框架初学-03-模板
  19. 车联网中密码技术的探究
  20. nginx反向代理,隐藏服务IP

热门文章

  1. 【交往智慧】002.和优秀的人接触
  2. [ZZ].NET自动探索式测试工具——Pex
  3. iOS 搭建XMPP环境时添加依赖库报错及解决
  4. windows和linux 修改 hosts的路径
  5. WPF学习笔记5: Xaml之Markup Extensions
  6. Vista曝致命漏洞 10秒钟可让系统崩溃
  7. Linux下清空回收站
  8. Unity 可重复随机数
  9. Java - 经常使用函数Random函数
  10. 修炼Python基础篇-set学习