/*
三个点 ...     (C语言变参)
如果是是形参里面出现,表示的是可变参数,即表示的传入的参数个数是可变,传多少个参数都被放到一个数组里面
C语言预处理器定义的一些宏 :
__LINE__        当时行号(预处理器正在执行的那一时刻),十进制数
__FUNCTION__    当时函数,字符串
__FILE__        当时文件,字符串
__DATE__        当时日期,字符串
__TIME__        当时时间,字符串__VA_ARGS__  指打印宏里面的可变参数,也就是函数参数里面的...
*/
#define DEBUG#ifdef DEBUG
#define DBG(...)    fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endifint main(void)
{DBG("tiaoshi.\n");return 0;
}

/*
内核中的DEBUG宏
#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args…) printk(fmt, ##args)
#else
#define DEBUG(fmt, args…) do {} while (0)
#endif

args…其实代表可变参数的意思,参数可以是零个,例如在使用时,可以如一下方式:
#define PRINT_DEBUG(fmt,args…) do{ if(a>b) {printf(fmt,##args); } }while(0)

PRINT_DEBUG(“hello word\n”);
PRINT_DEBUG("%s\n",“hello word”);
PRINT_DEBUG("%s %s\n",“hello”," word");

为何是“#define debug(fmt,args…) printf (fmt ,##args)”这种宏定义方式呢?
<1> #define debug(fmt,args) printf (fmt ,##args)
  当不定参数多于1个,会提示参数多于agrs对应的参数

<2> #define debug(fmt,…) printf (fmt ,##args)
  这种情况agrs找不到对应项

<3> #define debug(fmt,…) printf (fmt ,…)
  这种情况下,不定参数在预编译时全部被替换成“…”

<4> #define debug(fmt,args…) printf (fmt ,args)
   我测试了,也是可以的

<5> #define debug(fmt,args) printf (fmt ,##args)
   u-boot使用的方法

*/

关于linux中DBG调试宏的使用总结,减少代码冗余相关推荐

  1. 《Linux C编程从入门到精通》》一2.4 Linux中的调试环境gdb

    本节书摘来自异步社区<<Linux C编程从入门到精通>>一书中的第2章,第2.4节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  2. 【工具】VScode|Linux 中怎么调试 Python 项目比较方便?又名 VScode 怎么调试 Python 项目(兼容环境Ubuntu18.04)

    使用过 Anaconda.Jupyter.Pycharm.VScode.VS2022.pdb 这几个 IDE 去编写 python 项目或者维护 python 环境,各有各的优缺点,但 VScode ...

  3. python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://www.jb51.net/it/692145.html,在这篇文章中,有这样一段话,吸引了我的注意: 在 Linux 中 ls 是 ...

  4. Linux中的/proc文件系统详解(C/C++代码实现)

    Linux /proc这个特殊的目录包含有关Linux系统的所有详细信息,包括其内核.进程和配置参数.通过研究/proc目录,可以了解Linux命令的工作原理,甚至可以执行一些管理任务. 走进Linu ...

  5. 在子类中对get(), set() 方法进一步整合 减小代码冗余度

    前言: 我们都知道,封装是面向对象的核心思想.通常要对一些类进行封装(即属性private化,只提供一套public的get(),set()方法供外界访问),而当一个类的属性较多时候,那么创建一个该类 ...

  6. linux中多进程调试,linux下用gdb调试多进程

    今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表: 这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的. 一.多进程调试的命令 1.set follo ...

  7. 嵌入式Linux中TP调试笔记

    触摸屏一般是通过IIC来传输触摸点的坐标给Linux内核,一般而言,其步骤是: 当人触摸触摸屏时,触摸屏会产生一个中断信号给Linux内核,内核接收到中断信号后便会通过IIC去触摸IC里读取数据,因此 ...

  8. Linux 中的调试器——gdb的基本调试命令打字练习

    工欲善其事,必先利其器--首先我们需要有打字练习的工具 ,这里我推荐的是 金山打字通,下载链接为

  9. Linux中main和初启函数,ARM启动代码中_main 与用户主程序main()的区别

    //wings: ​汇总如下: ​1._main是编译系统提供的库函数,main()是用户自己编写的主函数: ​2._main主要做了三件事: ​①将code/RW搬到ram中: ​②初始化ZI数据: ...

最新文章

  1. Maya制作风格化的女性跑步动画学习教程
  2. linux遭入侵挖矿进程被隐藏案例分析
  3. 怎么随时获取Spring的上下文ApplicaitonContext,和Spring管理的Bean
  4. fcm模糊聚类matlab实例_一文学会使用MATLAB将仿真、试验数据可视化附带源程序
  5. markdown一边写一边预览_如何用Markdown轻松排版知乎专栏文章?
  6. 【Linux系统编程】进程替换:exec 函数族
  7. 判断用户的参数(条件测试语句)
  8. [js] 使用js实现一个图片剪裁的功能
  9. 近10万人基因组数据!美国All of Us项目发布首批人群队列数据
  10. 【报告分享】2021人才资本趋势报告:重塑时代-BOSS直聘.pdf(附下载链接)
  11. SQL Server 2008安装和配置图解图(转)
  12. topjui中datagrid增删改查
  13. Android WebView调用摄像头录像拍照处理
  14. 黎曼Zeta函数,人类文明黎曼Zeta函数,人类文明永恒的的纪念
  15. 第二部分 项目管理标准
  16. 在windows上配置本地域名解析,配置hosts文件
  17. Minecraft 1.18.1、1.18.2模组开发 19.拼图结构建筑(JigSaw Structure)
  18. 西安理工大学计算机科学与工程学院官网,罗靖-西安理工大学计算机科学与工程学院...
  19. vue3 接入网易易盾(webpack,vite)
  20. 水利部水利工程造价系统

热门文章

  1. ps教程-双重曝光效果实现
  2. 用 Python 将 matplotlib 图表集成到 PDF 中
  3. 便利贴撕页效果,隔壁产品都馋哭了
  4. c/c++控制台图片浏览
  5. 单身汪慎入,志玲姐姐的这个故事太虐心
  6. 特权同学IP核心中的学习
  7. 【转】独行巨蟹:BTS2.0那些事儿
  8. 百度离线地图示例之二:测距
  9. 图解 Vue3.0 编译器核心原理(Vue3.0源码解析)
  10. 什么是 NFT 洗盘交易:洗盘交易背后的原理