前言

在编写项目时,我们通常需要日志输出来帮助我们追踪程序执行的内容,以便在出现BUG时较为方便的复现,并在调试完成后快速的关闭过于详细的LOG输出,避免干扰使用中的体验,在函数中一个一个的增加printf函数相比之下较为不便,并且也不便于完成调试后的注释

为了解决这个问题,我们可以利用C语言中的宏定义来快速的构建一个自定义的调试功能,在能够输出详细信息的同时还可以一键开关

正文

编译器内置宏:

编译器内置了一些宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,也可以巧妙地帮我们输出非常有用的调试信息

ANSI C标准中有几个标准预定义宏:

  • LINE:等同于当前源代码中所在位置的行号;
  • FILE:等同于当前源文件名;
  • DATE:在源文件中插入编译时的日期
  • TIME:在源文件中插入编译时的时间;

定义用来打log的语句

使用以上这几个宏定义,可以简单的构建一个打LOG语句,其具体实现方法如下

#include "stdio.h" // 这里选择__DEBUG__作为开关,注释掉下面这一行,则可以直接关闭程序中的DEBUG输出
#define __DEBUG__#ifdef __DEBUG__
// 如果对__DEBUG__进行定义,则将对DEBUG(format,...)中的内容按照printf的方式进行输出#define DEBUG(format,...) printf("File: %s\r\nFun: %s\r\nLine: %05d\r\n"format"\n", __FILE__, __func__, __LINE__, ##__VA_ARGS__)
// 不知道##__VA_ARGS__的含义的话可以看这个:https://zhuanlan.zhihu.com/p/410584465
#else
// 如果没有对__DEBUG__进行定义,则DEBUG(format,...)会被替换为空,所以DEBUG语句将不会输出
#define DEBUG(format,...)
#endif

通过以上代码,我们就定义出了一个可以一键开关,并且对DEBUG()语句所在位置进行快速输出调试的语句,语句被执行时就会自动打印当前所在的文件、函数与在源代码中的行数,同时括号里的内容会作为自定义语句进行输出,下面我们将这个语句放在代码用测试一下

#include "stdio.h" // 这里选择__DEBUG__作为开关,注释掉下面这一行,则可以直接关闭程序中的DEBUG输出
#define __DEBUG__   #ifdef __DEBUG__
// 如果对__DEBUG__进行定义,则将对DEBUG(format,...)中的内容按照printf的方式进行输出
#define DEBUG(format,...) printf("File: %s\r\nFun: %s\r\nLine: %05d\r\n"format"\n", __FILE__, __func__, __LINE__, ##__VA_ARGS__)  #else
// 如果没有对__DEBUG__进行定义,则DEBUG(format,...)会被替换为空,所以DEBUG语句将不会输出
#define DEBUG(format,...)
#endif   void fun_name()
{char str[]="Hello World\r\n";DEBUG("[DEBUG LOG]: %s\r\n",str);    //输出自定义内容[DEBUG LOG]: Hello World
}int main()
{      fun_name();printf("compile data:%s\r\ncompile time:%s\r\n", __DATE__, __TIME__);    return 0;
}

测试效果

开启调试功能

如果想要开启调试功能,则不需要改动代码,直接运行后的效果如下图所示  
注意:File,compile time,compile data与源代码所在的地址,编译的时间,编译的日期有关,结果是会存在差异的

关闭调试功能

注释#define __DEBUG__即可关闭调试语句的输出,使得DEBUG()时效,此时运行效果如下

[C语言] 在单片机的嵌入式开发中使用宏定义一键开关日志输出/打log调试相关推荐

  1. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  2. 嵌入式开发中的C语言知识点

    嵌入式开发中的C语言知识点 1.关键字 2.数据类型 3.内存管理和存储架构 4.指针和数组 5.结构类型和对齐 6.预处理机制 1.关键字 几乎每一门语言中都有关键字,具有特殊功能,C语言也不例外, ...

  3. 单片机c语言位运算写法,单片机与嵌入式系统中C语言的位运算小记

    原标题:单片机与嵌入式系统中C语言的位运算小记 编了个PIC的项目,对里的还是蛮有感悟的,特此记录一下. 譬如说,在程序中定义了一个char类型的变量, purge_short_enable_flag ...

  4. 嵌入式开发中C语言编程要点简述!

    在嵌入式Linux的C语言开发中,C语言的基本编程依然是最重要的内容.除此之外,与一般的C语言编程相比,嵌入式Linux的C语言编程有以下一些要点: 1.库函数与系统调用 在进行C语言编程的时候,使用 ...

  5. 嵌入式开发中DSP与FPGA的关系

    嵌入式开发中DSP与FPGA的关系 常所说的单片机侧重于控制,不支持信号处理,属于低端嵌入式处理器,arm可以看做是低端单片机升级版,支持操作系统管理,更多接口如网卡,处理能力更强;fpga是可编程逻 ...

  6. 嵌入式开发比单片机要难很多?谈谈单片机和嵌入式开发设计经历

    嵌入式开发比单片机要难很多?谈谈单片机和嵌入式开发设计经历 \\\插播一条:文章末尾有惊喜哟~/// 单片机和嵌入式,其实没有什么规范的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他 ...

  7. 嵌入式开发中常用的几种通信接口总结

    关注.星标公众号,直达精彩内容 在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线. 以下内容为常用板上通信接口:包括I2C.SPI.UART.1-Wire: I ...

  8. 嵌入式开发中数值常量如何转化为内存地址?

    作者 | 李肖遥       责编 | 欧阳姝黎 最近在使用 Nordic 的最新蓝牙芯片 nRF52832 开发过程中,因为做一些测试涉及到对内存地址的操作,有(*(volatile unsigne ...

  9. 状态机思路在嵌入式开发中的应用说明及注意事项(普罗米修斯中不少功能节点用了状态机的方法来写)

    我感觉普罗米修斯很多功能模块里面都用到了状态机的思路 比如圆环穿越的,比如最新的二维码降落的代码. 摘自:https://mp.weixin.qq.com/s/qRmBDH-VIHM26AaNFoD9 ...

最新文章

  1. 【译】MVVM Tutorial with ReactiveCocoa: Part 1/2
  2. pytorch 不同设备下保存和加载模型,需要指定设备
  3. [OS复习]设备管理4
  4. python 文件指定位置写入-Python从文件中读取指定的行以及在文件指定位置写入...
  5. 腾讯课堂的物理实验(2017计蒜客初赛第三场)
  6. 百度经验 回享计划
  7. LeetCode 2176. 统计数组中相等且可以被整除的数对
  8. 超简单的mysql多实例布置
  9. 【Tensorflow】深度学习实战02——Tensorflow实现进阶的卷积网络(CIFAR-10)
  10. Objective-C 日记④ 集合家族
  11. 微课|中学生可以这样学Python(例11.2):tkinter猜数游戏(3)
  12. Java线程池ThreadPoolExecutor源码分析
  13. 警告: Can't find the request for http://localhost:8080/ibatisSpringDemo/ws/testWS's Observer
  14. 地统计之检查空间自相关
  15. Hbase常用操作命令
  16. 关于dom4j中jaxen运行报错问题
  17. HTTP协议:工作原理
  18. android 主流分辨率是多少,Android程序开发设计主流屏幕分辨率介绍
  19. Go函数和方法的区别
  20. VSCode Markdown 插件

热门文章

  1. PDF转换技巧之如何使用PDF转换器经验分享
  2. python数据分析(1)——获取微信好友的统计信息
  3. 山东理工大学2000年12月单片机实训--按键计时器
  4. 个人计算机上的服务器怎么打开,电脑服务器怎么打开
  5. 计算机主板上实时时钟晶振频率为,你知道你的笔记本电脑主板中的晶振好不好吗?...
  6. 单片机中的WFI/WFE指令
  7. 计算机二级ppt操作题内容,计算机二级考试ms office考试题库ppt 操作题附答案
  8. oshi - 服务器及应用监控库 - 简介与使用
  9. 2022SDUT知到/智慧树----C语言第四章测试题解
  10. 太空科技:地球之外有没有其他星球存在生命迹象?