初出茅庐的小李博客之根据编译时间生成软件版本号

news2024/11/20 1:36:35

为什么要软件版本号呢?

生成软件版本号是在软件开发和维护过程中非常重要的一项任务,它有很多意义和好处,同时也有多种常见的方法。

  1. 标识和追踪:软件版本号是唯一的标识符,用于区分不同版本的软件。这有助于开发人员和用户识别和追踪软件的不同发布版本。当出现问题时,可以更容易地确定特定版本中的错误或改进。

  2. 沟通和文档:版本号提供了一种简单而清晰的方式来与团队成员、用户和其他利益相关者进行沟通。通过版本号,人们可以明确了解到底是哪个版本的软件正在讨论,从而更容易地协作和解决问题。

  3. 发布计划:版本号可以用于制定和执行软件的发布计划。通过设定版本号,团队可以计划哪些功能和改进将包含在特定版本中,以及何时发布这些版本。

  4. 用户期望管理:版本号可以用于管理用户的期望。用户可以根据版本号了解到软件的新功能、改进和修复的问题。这有助于用户知道他们是否需要升级或采取其他行动。

  5. 软件稳定性:通过良好设计的版本号系统,可以区分主要版本、次要版本和修订版本。这有助于用户快速识别是否有可能引入不稳定性的大幅更改。

常见生成软件版本号的方法有哪些?

  1. 语义版本号(Semantic Versioning,SemVer):SemVer 是一种流行的版本号方案,通常由三部分组成:主版本号、次版本号和修订号,例如 1.2.3。主版本号增加表示不兼容的变化,次版本号增加表示向后兼容的功能添加,修订号增加表示向后兼容的错误修复。

  2. 日期版本号:使用日期作为版本号的一部分,例如 2023.09.11,可以让人们很容易地知道软件的发布日期。这对于在特定日期之前或之后的版本上工作或测试很有用。

  3. 自定义版本号:一些团队和组织使用自定义版本号方案,根据他们的需求制定。这可能包括项目标识符、构建号码、分支信息等。

  4. 预发布版本和元数据:有时,版本号可能包括预发布版本和元数据信息,以进一步详细说明软件的状态和特性。例如,1.2.3-beta1 表示一个预发布版本,而 1.2.3+build456 表示带有构建号的版本。

  5. 语言特定的版本号:某些编程语言和工具具有自己的版本号规范,开发人员应遵循这些规范,以确保与相关工具的兼容性。

在单片机中如何生成日期版本号?

先介绍一下c语言常见的两个宏定义

在C语言中,有一些特殊的宏定义,用于获取当前编译日期和时间等信息。以下是两个常见的宏定义示例:

  1. __DATE__ 宏

    printf("编译日期:%s\n", __DATE__);
    

    这个宏会在编译时被替换为一个字符串,表示编译源代码的日期。通常,它的格式类似于"Sep 11 2023",表示月份、日期和年份。

  2. __TIME__ 宏

    printf("编译时间:%s\n", __TIME__);
    

    这个宏会在编译时被替换为一个字符串,表示编译源代码的时间。通常,它的格式类似于"12:34:56",表示小时、分钟和秒。

这些宏可以用于在代码中记录编译日期和时间,这在调试和版本管理中非常有用。

具体实现

#include "version.h"
#include <string.h>
#include <stdlib.h>


void Get_Compile_Date_Base(uint8_t *Year, uint8_t *Month, uint8_t *Day)
{
	//Sep 11 2023
	const char *pMonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
	const char Date[12] = __DATE__;//取编译日期
	uint8_t i;
	for(i = 0; i < 12; i++)if(memcmp(Date, pMonth[i], 3) == 0)*Month = i + 1, i = 12;
	*Year = (uint8_t)atoi(Date + 9); //Date[9]为2位年份,Date[7]为完整年份
	*Day = (uint8_t)atoi(Date + 4);
}


void Get_Compile_Time_Base(uint8_t *HH, uint8_t *MM, uint8_t *SS)
{
	//15:40:23
	const char Time[10] = __TIME__;//取编译时间
	*HH = (uint8_t)atoi(Time + 0);
	*MM = (uint8_t)atoi(Time + 3);
	*SS = (uint8_t)atoi(Time + 6);
}

char g_date_buf[10];
char g_time_buf[10];
char g_version_buf[20];
char* Get_Compile_Date(void)
{
	uint8_t  Year, Month, Day;
	Get_Compile_Date_Base(&Year, &Month, &Day);//取编译日期
	sprintf(g_date_buf, "20%02d-%02d-%02d", Year, Month, Day);//任意格式化
	return g_date_buf;
}

char* Get_Compile_Time(void)
{
	uint8_t  HH, MM, SS;
	Get_Compile_Time_Base(&HH, &MM, &SS);//取编译时间
	sprintf(g_time_buf, "%02d:%02d:%02d", HH, MM, SS);//任意格式化
	return g_time_buf;
}

char* Get_Compile_Ver(void)
{
	uint8_t  Year, Month, Day;
	uint8_t  HH, MM, SS;
	Get_Compile_Date_Base(&Year, &Month, &Day);//取编译日期
	Get_Compile_Time_Base(&HH, &MM, &SS);//取编译时间
	sprintf(g_version_buf, "20%02d-%02d-%02d-%02d-%02d-%02d",Year, Month, Day, HH, MM, SS);//任意格式化
	return g_version_buf;
}

#ifndef _VERSION_H_
#define _VERSION_H_


#include "stm32f4xx.h"


char* Get_Compile_Date(void);
char* Get_Compile_Time(void);
char* Get_Compile_Ver(void);

#endif

实现效果

    printf("RI  QI:%s\r\n",__DATE__);
	printf("SHI JIAN:%s\r\n",__TIME__);
    printf("#############################Test#########################\r\n");
	printf("RI  QI:%s\r\n",Get_Compile_Date());
	printf("SHI JIAN:%s\r\n",Get_Compile_Time());
	printf("Soft Version:%s\r\n",Get_Compile_Ver());

在这里插入图片描述
编译时间是:
2023年9月11日21点03分57秒(就是刚才)

其他方式(直接宏定义实现)

参考博客:http://t.csdn.cn/BNv0F

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【案例分享】部署华为防火墙确保园区出口安全

【微|信|公|众|号&#xff1a;厦门微思网络】 部署华为防火墙确保园区出口安全案例 本案例将以园区典型组网为例&#xff0c;主要介绍园区出口安全的部署。具体业务安全要求如下&#xff1a; 内网用户可以正常访问Internet资源&#xff0c;但只能访问教育/科学类、搜索/门户类网…

【计算机组成 课程笔记】5.2 处理器的设计步骤(2)

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 5 - 3 - 503-运算指令的控制信号&#xff08;14-58--&#xff09;_哔哩哔哩_bilibili 【计算机组成 课程笔记】5.1 处理器的设计步骤-CSDN博客 中介绍了处理器的设计步骤中的前三步&#xff0c;接下来我们继续介绍…

一文了解大模型工作原理——以ChatGPT为例

文章目录 写在前面1.Tansformer架构模型2.ChatGPT原理3.提示学习与大模型能力的涌现3.1 提示学习3.2 上下文学习3.3 思维链 4.行业参考建议4.1 拥抱变化4.2 定位清晰4.3 合规可控4.4 经验沉淀 写在前面 2022年11月30日&#xff0c;ChatGPT模型问世后&#xff0c;立刻在全球范围…

模电课程设计

主要内容跟本科实验关系很大&#xff0c;可以用来借鉴。 包含文件有&#xff1a;实验报告、Multisim仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 目录 1、模电课设&#xff1a;用Multisim简单了解二极管 2、模电课设&#xff1a;用Multisim简析三极管与场效应…

Python基础语法练习

输出欢迎信息 方法一&#xff1a; 定义变量赋值并输出&#xff0c;用将变量和字符拼接 username "EMT" print("Welcome,” username)方法二&#xff1a; 用format函数格式化输出变量&#xff0c;并替换{}中的内容 username "EMT" print("welcom…

vue3_动态添加路由,以及路由刷新后页面丢失问题

首先&#xff0c;是要将权限数据本地持久化存储 接着在router文件夹index.js中引入store中的权限数据&#xff0c;并导出一个方法&#xff0c;判断权限当中的数据&#xff0c;并跟roleEnum路由规则匹配&#xff0c;匹配上之后则addRoute() 在登录之后调用这个方法&#xff0c;动…

django添加数据库字段进行数据迁移

1.修改view.py里面的变量 2.在model.py新增字段 3.打开terminal并将环境切到项目所在环境&#xff0c;切换方式为 4.执行命令 python manage.py makemigrations backend python manage.py migrate

CSP 201403-1 相反数

答题 用两个优先队列&#xff0c;一个记录正数升序排序&#xff0c;一个记录负数降序排序&#xff0c;然后在两个队列都不为空的情况下取二者top相加与0比较大小&#xff0c;如果等于0&#xff0c;那么相反数的数目增加一对并同时弹出队列&#xff0c;如果小于0&#xff0c;那…

智能称重解决方案

智能称重解决方案 在现代制造业中&#xff0c;确保产品质量是至关重要的。尤其是在装配产线中&#xff0c;经常面临着漏装、少装等装箱异常问题&#xff0c;这可能导致产品不合格、客户投诉以及损失。为了应对这一挑战&#xff0c;我们需要开发一套智能监控系统&#xff0c;采…

PostgreSQL Page结构

Page结构 在数据文件&#xff08;堆表、索引、自由空间映射和可见性映射&#xff09;内部&#xff0c;它被划分为固定长度的page&#xff08;或block&#xff09;&#xff0c;默认为 8192 字节&#xff08;8 KB&#xff09;。每个文件中的页面从 0 开始顺序编号&#xff0c;这…

管理类联考——数学——汇总篇——知识点突破——应用题——线性规划

⛲️ 一、考点讲解 线性规划特征 线性规划是运筹学中辅助人们进行科学管理的一种数学方法。线性规划所研究的是&#xff1a;在一定条件下&#xff0c;合理安排人力物力等资源&#xff0c;使经济效果达到最好。一般地&#xff0c;求线性目标函数在线性约束条件下的最大值或最小…

Shell编程之sort

sort 命令将文件的每一行作为比较对象&#xff0c;通过将不同行进行相互比较&#xff0c;从而得到最终结果。从首字符开始&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将结果按升序输出。 基本语法 sort (选项)(参数) 常用选项 常用选项 -n根据字符串的数字比较-r…

多功能批量剪辑软件一天剪辑1000条原创视频

下面一个视频用了呆头鹅批量剪辑软件播放量竟然能达到100多万。 他是怎么做到的呢&#xff1f;下面我给大家详细的说一下 ​ 在短视频平台开展业务&#xff0c;需具备批量制作视频的能力&#xff0c;为了超越同行&#xff0c;需大量更新作品&#xff0c;争取更多曝光。素…

pycharm打开远程宿主机或远程docker文件夹目录方法,以及设置代码同步

pycharm打开远程宿主机或远程docker文件夹目录方法&#xff0c;以及设置代码同步_pycharm怎么查看服务器目录_Sisyphus~~的博客-CSDN博客1.如何显示远程的文件夹目录2.如何设置代码同步_pycharm怎么查看服务器目录https://blog.csdn.net/weixin_62321285/article/details/12740…

机器学习入门教学——梯度下降、梯度上升

1、简介 梯度表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处沿着该方向&#xff08;梯度的方向&#xff09;变化最快&#xff0c;变化率&#xff08;梯度的模&#xff09;最大&#xff0c;可理解为导数。梯度上升和梯度下降是优化算法中常用的…

兵工七子,学硕爆冷!公平,可不考英语!

一、学校及专业介绍 沈阳理工大学&#xff08;Shenyang Ligong University&#xff09;&#xff0c;位于辽宁省沈阳市。东北老牌工科院校&#xff0c;始建于1948年&#xff0c;是我军为培养新中国急需的兵工专门人才在东北地区创建的第一所本科军工高等学校&#xff0c;是共和…

【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )

文章目录 一、构造函数与析构函数二、代码示例 - 构造函数与析构函数用途 一、构造函数与析构函数 在 C 语言中 , " 构造函数 " 和 " 析构函数 " 都是 C 类中的 特殊函数 , 分别用于 初始化对象销毁对象 ; C 类 在创建 实例对象 时自动调用 构造函数 这个…

打造高效的私密论坛网站:Cpolar内网穿透+HadSky轻量级搭建指南

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

Kubernetes (K8s) 解读:微服务与容器编排的未来

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

怎样做思维导图?教你这样轻松制作

怎样做思维导图&#xff1f;思维导图是一种非常有用的工具&#xff0c;它可以帮助你更好地组织和展示你的想法。无论是个人使用还是团队协作&#xff0c;思维导图都是一个非常好的选择。在制作思维导图时&#xff0c;有很多工具可以使用&#xff0c;那么今天就给大家来介绍一下…