在嵌入式C开发中其实有几个特别有用的预定义宏可以用来进行软件版本管控日志信息打印和问题排查分析等这几个宏为编译器定义的并非C语言标准库固有的关键字函数或宏定义本文章要介绍的预定义宏主要包括下面4个__DATE__为一个字符串常量主要用于获取当前日期即可以用来表示程序编译的日期日期格式为月份英文缩写 两位数日期 四位数年份简单用法为复制printf(app build date: %s \r\n, __DATE__);__TIME__为一个字符串常量主要用于获取当前时间即可以用来表示程序编译的时间为24小时制时间格式为小时:分钟:秒钟简单用法为复制printf(app build time: %s \r\n, __TIME__);这里需要注意的是上面两个宏反映的是程序编译时间而不是程序运行时间这意味着每次重新编译程序时这些宏的值都会更新但在程序运行期间它们的值是保持不变的。__LINE__为一个整型常量主要用来表示当前代码所在的行号即在文件中的第几行常用于调试日志记录等可以帮助开发者更快地定位代码位置。简单用法为复制printf(当前行号: %d \r\n, __LINE__);__FILE__为一个字符串常量主要用来表示当前源文件的文件名信息相对路径常用于调试信息日志记录及错误报告中。简单用法为复制printf(当前文件: %s \r\n, __FILE__);以上描述的4个预定义宏几乎所有的用于MCU开发的C编译器都支持包括GCC如ARM GCCIAREmbedded WorkbenchKeilMDK-ARMMicrochipXC系列编译器。接下来我们通过实际代码和运行测试给大家展示一下代码结果。我们先来看看最简单的用法即逐个打印出来这4个宏的信息main.c里面的代码如下复制printf(app build date: %s\r\n, __DATE__);printf(app build time: %s\r\n, __TIME__);printf(app current line: %d\r\n, __LINE__);//此代码在main.c的第124行printf(app current file: %s\r\n\r\n, __FILE__);编译程序并运行后通过串口查看执行结果如下图所示如果把日期和时间结合起来使用可以用如下代码复制printf(app build date: %s %s\r\n, __TIME__, __DATE__);printf(app current line: %d\r\n, __LINE__);printf(app current file: %s\r\n\r\n, __FILE__);执行结果如下图所示程序编译日期和时间往往会被加在初始化代码里与固件版本放在一起每次上电后执行一次输出即可通过串口等终端掌握当前固件的相关信息便于软件问题追踪和固件版本管控参考代码如下所示复制printf(app version: V%d.%d.%d, %s %s\r\n,LC02_VERSION_MAJOR,LC02_VERSION_MAIN,LC02_VERSION_PATCH,__TIME__, __DATE__);执行结果如下图所示另外在实际代码开发和调试时__FILE__和__LINE也经常被结合使用以达到快速定位代码异常位置的目的参考代码如下复制printf(%s:%d\r\n, __FILE__, __LINE__);在调试信息太多时如果你想将调试信息分类也可以给调试信息分级别比如加上INFODEBUG和ERROR等标签都可以参考代码如下复制printf([INFO] %s:%d\r\n, __FILE__, __LINE__);printf([DEBUG] %s:%d\r\n, __FILE__, __LINE__);printf([ERROR] %s:%d\r\n, __FILE__, __LINE__);这个时候为了更好地管理调试信息可以增加一个宏定义参考代码如下复制#define LOG_ERROR(message) printf([ERROR] %s:%d - %s\n, __FILE__, __LINE__, message)message即为需要的自定义的错误打印信息。比如需要输出传感器数据异常错误你就可以编写如下代码复制LOG_ERROR(sensor data error, pleasecheckandretry!);可以参考下面的代码进行使用当然可以扩展的更好复制#define LOG_INFO(message) printf([INFO] %s:%d - %s\n, __FILE__, __LINE__, message)#define LOG_DEBUG(message) printf([DEBUG] %s:%d - %s\n, __FILE__, __LINE__, message)#define LOG_ERROR(message) printf([ERROR] %s:%d - %s\n, __FILE__, __LINE__, message)执行结果如下图所示在有些串口助手软件里类似这种error信息都会直接用不一样的颜色标注出来一目了然一看就知道是出现运行错误信息了我用的串口助手是MobaXterm。综上所述在程序开发和问题调试时如果你能灵活使用这4种预定义宏则可以显著提高调试效率。---------------------作者dffzh链接https://bbs.21ic.com/icview-3477530-1-1.html?_dsign4c4ee37e来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。