首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言打印程序行号、日期方便调试程序

C语言打印程序行号、日期方便调试程序

作者头像
DS小龙哥
发布于 2022-06-17 02:51:50
发布于 2022-06-17 02:51:50
2.3K0
举报

一、前言

平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,对程序的调试起到很大的帮助,可以快速定位问题。特别是开发单片机程序时,使用这些宏打印这些信息或者在LCD上显示程序的编译日期、时间,可以知道这个单片机上的固件是什么时候编译。帮助判断版本。

代码语言:javascript
AI代码解释
复制
ANSIC标准定义了可供C语言使用的预定义宏:
__LINE__ : 在源代码中插入当前源代码行号
__FILE__ : 在源代码中插入当前源代码文件名
__DATE__ : 在源代码中插入当前编译日期
__TIME__ : 在源代码中插入当前编译时间

其中标识符__LINE__和__FILE__一般用来调试程序,打印信息,方便定位错误。

标识符__DATE__和__TIME__一般可以用来表示固件的版本,方便了解运行的程序是什么时候的版本。

标识符__LINE__是一个整数,其他的文件名称、日期、时间都是字符串。

二、打印示例

代码语言:javascript
AI代码解释
复制
printf("编译日期与时间: %s,%s\n", __DATE__,__TIME__);
printf("当前所在行号:%d\r\n", __LINE__);
printf("当前源文件名称:%s\r\n", __FILE__);
printf("当前固件编译日期:%s\r\n", __DATE__);
printf("当前固件编译时间:%s\r\n", __TIME__);

三、C语言封装快捷Debug

代码语言:javascript
AI代码解释
复制
#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  获取可变参数列表  */
	fflush(stdout);                              /*  强制刷新输出缓冲区  */
	count = vfprintf(stderr, format, arg_data);  /*  将信息输出到标准出错流设备  */
	va_end(arg_data);                            /*  可变参数列表结束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{

}
#endif

通过DEBUG这个宏来开启是否开启调试信息打印功能,如果程序稳定后,不需要打印调试信息,就可以将DEBUG的定义取消掉即可。

完整代码:

代码语言:javascript
AI代码解释
复制
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <iostream>  
#include <string> 

using namespace std;

//#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  获取可变参数列表  */
	fflush(stdout);                              /*  强制刷新输出缓冲区  */
	count = vfprintf(stderr, format, arg_data);  /*  将信息输出到标准出错流设备  */
	va_end(arg_data);                            /*  可变参数列表结束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{
	return 0;
}
#endif


int main()
{
	DebugPrintf("编译日期与时间: %s,%s\n", __DATE__,__TIME__);
	DebugPrintf("当前所在行号:%d\r\n", __LINE__);
	DebugPrintf("当前源文件名称:%s\r\n", __FILE__);
	DebugPrintf("当前固件编译日期:%s\r\n", __DATE__);
	DebugPrintf("当前固件编译时间:%s\r\n", __TIME__);
	return 0;
}

四、STM32单片机上封装printf函数

代码语言:javascript
AI代码解释
复制
/*
函数功能: 字符串发送
*/
void USARTx_StringSend(USART_TypeDef *USARTx,u8 *str)
{
   while(*str!='\0')
   {
       USARTx->DR=*str++;
       while(!(USARTx->SR&1<<7)){}
   }
}

//printf函数底层函数接口
int fputc(int c, FILE* stream)
{
    USART1->DR=c;
    while(!(USART1->SR&1<<7)){}
    return c;
}

/*
函数功能: 格式化打印函数
*/
char USART1_PRINTF_BUFF[1024];
void USART1_Printf(char *fmt,...)
{
   va_list ap;
   /*1. 初始化形参列表*/
   va_start(ap,fmt);
   /*2. 提取可变形参数据*/
    vsprintf(USART1_PRINTF_BUFF,fmt,ap);
   /*3. 结束,释放空间*/
    va_end(ap);
   /*4. 输出数据到串口1*/
   USARTx_StringSend(USART1,(u8*)USART1_PRINTF_BUFF);
   
   //USART1_Printf("%d%s",123,454656); 
   //int data=va_arg(ap,int);
}

USART1_Printf的用法与printf是一样的,通过这个函数就可以实现数据打印到任意地方,包括改成存储到SD卡上。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter入门(二)
* Padding(个人感觉和Container很像)(下面的代码很难看,重要的是思路)
用户3112896
2019/12/27
6580
Flutter入门(二)
Flutter组件随笔练习
Container组件 import 'package:flutter/material.dart'; //快捷方式:fim void main() { runApp(MyApp()); } //自定义组件 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp(
明知山
2020/09/02
1.1K0
Flutter入门(一)
Flutter的sdk地址https://flutter.dev/docs/development/tools/sdk/releases
用户3112896
2019/12/27
8270
Flutter入门(一)
Padding、Row、Column、Expanded、Stack、AspectRatio、Card、Wrap等布局组件初体验
在HTML中,常见的布局标签都有padding属性,但是在Flutter中,很多的widget是没有padding属性的。这时我们就可以使用padding组件来处理容器与子元素之间的间距。
拉维
2019/08/12
8770
Padding、Row、Column、Expanded、Stack、AspectRatio、Card、Wrap等布局组件初体验
Flutter中ListView 垂直列表组件、水平列表组件
列表布局是项目开发中最常用的一种布局方式,Flutter 中我们可以通过 ListView 来定义列表项,支持垂直和水平方向展示。
越陌度阡
2022/05/06
1.9K0
Flutter中ListView 垂直列表组件、水平列表组件
Flutter 中 ListView 垂直列表组件、水平列表组件
列表布局是项目开发中最常用的一种布局方式,Flutter 中我们可以通过 ListView 来定义列表项,支持垂直和水平方向展示。
越陌度阡
2020/12/21
2.4K0
Flutter 中 ListView 垂直列表组件、水平列表组件
6.Flutter学习之Padding,Row,Column,Expanded组件
参考博客: 笔录Flutter(五)布局系列:Row、Column、Flex、Expanded 常用属性、使用 https://blog.csdn.net/huyongl1989/article/details/83745871 https://blog.csdn.net/gzx110304/article/details/101627286
易帜
2022/02/09
4240
6.Flutter学习之Padding,Row,Column,Expanded组件
flutter基础布局代码
骨灰级别的基础代码,只是做个简单的记录,方便以后看 都是用dart写的,都在flutter项目下的lib文件夹下 import 'package:flutter/material.dart'; import './tomFont.dart'; void main() { runApp( MaterialApp( theme: ThemeData( primarySwatch: Colors.yellow, ), home: Scaffold(
Tom2Code
2023/02/14
8420
flutter基础布局代码
Flutter中AspectRatio、Card 卡片组件
AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由宽度和比率决定的,类似于 BoxFit 中的 contain,按照固定比率去尽量占满区域。
越陌度阡
2020/12/23
2K0
Flutter中AspectRatio、Card 卡片组件
Flutter入门(四)
自定义的好处是可以在addListener中增加监听,通过setState修改状态
用户3112896
2019/12/27
1.6K0
Flutter这么火为什么不了解一下呢?(下)
Note: 如何代码实现有问题,可以依据Github上的lib/main.dart 来检查你的代码。
Android技术干货分享
2019/03/26
1.5K0
Flutter这么火为什么不了解一下呢?(下)
【Flutter 16】图解 ListView 异步加载数据与 Loading 等待
和尚前两天再学 ListView 时,整理了一下在列表中展示多种不同 item 样式,今天继续深入学习异步请求数据并加载新闻列表以及初始进入页面的 loading 等小知识点。暂时还没有学习下拉刷新与上划加载更多。
阿策小和尚
2019/08/12
3.9K0
【Flutter 16】图解 ListView 异步加载数据与 Loading 等待
Flutter中构建布局 顶
然后本指南回过头来解释Flutter的布局方法,并说明如何在屏幕上放置一个小部件。 在讨论如何水平和垂直放置小部件之后,会介绍一些最常见的布局小部件。
南郭先生
2018/08/14
47.9K0
Flutter中构建布局
                                                    顶
【Flutter 专题】07 您搭好【登录】页面了么?
和尚最近在利用业余时间学习 Flutter,还真的是值得研究。和尚觉得学习一门技术最好的方式就是动手,在实践过程中结合官网文档才能更快的学习和理解。因为和尚技术太差,花了很久才搭建了一个最简单的【登录】页面,对于同一个页面,搭建的方式千差万别,和尚的方式也绝非最佳,现在仅结合这个基本的【登录】页面记录整理一下遇到的问题。 和尚这次整理的小博客只是单纯的搭建页面,不涉及以无逻辑和页面跳转,毕竟和尚还没研究到那部分。
阿策小和尚
2019/08/12
1.3K0
【Flutter 专题】07 您搭好【登录】页面了么?
【Flutter 专题】08 小小优化【登录】页面
和尚前两天花了很久才搭建了一个最简单的【登录】页面,但依然还有很多需要优化的地方,和尚又花了很久的时间尝试做了一点点的优化,仅针对优化的部分简单整理一下。
阿策小和尚
2019/08/12
1.8K0
【Flutter 专题】08 小小优化【登录】页面
Flutter组件学习(二)—— Image
上一节中,我们讲了 Flutter 中 Text 组件的一些用法以及 API,本节我们继续学习 Flutter 中的 Image 组件,同样先上图:
用户2802329
2018/12/21
1.6K0
Flutter一切皆widget但是不要将所有东西放入一个widget
作为 Flutter 开发人员,我相信您在您的开发生活中至少听说过这句流行的句子:“**一切都是widget”。这是 Flutter 的口头禅,它揭示了这个非常好的 SDK 的内在力量!
徐建国
2021/11/30
1.5K0
Flutter一切皆widget但是不要将所有东西放入一个widget
Flutter中GridView网格列表组件的使用
当数据量很大的时候用矩阵方式排列比较清晰,此时我们可以用网格列表组件 GridView 实现布局。
越陌度阡
2022/05/06
4.6K0
Flutter中GridView网格列表组件的使用
Flutter GridView 使用
今天学习一下在Flutter中怎么使用GridView,效果如上图。 头部是一个Banner,使用的是第三方的
赵哥窟
2019/09/20
2.5K0
Flutter GridView 使用
超过百万的StackOverflow Flutter 问题-第二期
老孟导读:一个月前分享的《超过百万的StackOverflow Flutter 问题-第一期》受到很多朋友的喜欢,非常感谢大家的支持,在文章末尾有第一期的链接,希望此文能对你有所帮助。
老孟Flutter
2020/09/11
2K0
推荐阅读
相关推荐
Flutter入门(二)
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档