C++基于编译时间自动生成版本号_c++自动生成版本号-CSDN博客
Excerpt
文章浏览阅读5.1k次,点赞3次,收藏21次。我们希望每次编译发布程序都有不同的版本号。但是每次编译都需要修改版本号特别麻烦。本文介绍一种基于编译时间生成版本号的方法。C++内置宏C/C++编译器会内置有两个获取编译时间的宏:DATE__和__TIME;__DATE__:在源文件中插入当前的编译日期__TIME__:在源文件中插入当前编译时间;#include <stdio.h>int main(void) { printf(“Date : %s\n”, DATE); _c++自动生成版本号
我们希望每次编译发布程序都有不同的版本号。但是每次编译都需要修改版本号特别麻烦。本文介绍一种基于编译时间生成版本号的方法。
C++内置宏
C/C++编译器会内置有两个获取编译时间的宏:__DATE__和__TIME__;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main(void)
{
printf("Date : %s\n", __DATE__);
printf("Time : %s\n", __TIME__);
}
|
输出:
1 2 3
| Date : May 14 2020
Time : 19:34:54
|
日期转化成数字表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #define BUILD_YEAR_CH0 (__DATE__[ 7])
#define BUILD_YEAR_CH1 (__DATE__[ 8])
#define BUILD_YEAR_CH2 (__DATE__[ 9])
#define BUILD_YEAR_CH3 (__DATE__[10])
#define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
#define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
#define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
#define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
#define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
#define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
#define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
#define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
#define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
#define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')
#define BUILD_MONTH_CH0 \
((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')
#define BUILD_MONTH_CH1 \
( \
(BUILD_MONTH_IS_JAN) ? '1' : \
(BUILD_MONTH_IS_FEB) ? '2' : \
(BUILD_MONTH_IS_MAR) ? '3' : \
(BUILD_MONTH_IS_APR) ? '4' : \
(BUILD_MONTH_IS_MAY) ? '5' : \
(BUILD_MONTH_IS_JUN) ? '6' : \
(BUILD_MONTH_IS_JUL) ? '7' : \
(BUILD_MONTH_IS_AUG) ? '8' : \
(BUILD_MONTH_IS_SEP) ? '9' : \
(BUILD_MONTH_IS_OCT) ? '0' : \
(BUILD_MONTH_IS_NOV) ? '1' : \
(BUILD_MONTH_IS_DEC) ? '2' : \
'?' \
)
#define BUILD_DAY_CH0 ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')
#define BUILD_DAY_CH1 (__DATE__[ 5])
#define BUILD_HOUR_CH0 (__TIME__[0])
#define BUILD_HOUR_CH1 (__TIME__[1])
#define BUILD_MIN_CH0 (__TIME__[3])
#define BUILD_MIN_CH1 (__TIME__[4])
#define BUILD_SEC_CH0 (__TIME__[6])
#define BUILD_SEC_CH1 (__TIME__[7])
|
上述代码讲日期和时间转化成单个数字表示,方便后续根据特定的格式生成版本号。
如果编译日期时间:May 14 2020 19:34:54
转化后结果如下表:
宏 | 对应的值 |
BUILD_YEAR_CH0 | 2 |
BUILD_YEAR_CH1 | 0 |
BUILD_YEAR_CH2 | 2 |
BUILD_YEAR_CH3 | 0 |
BUILD_MONTH_CH0 | 0 |
BUILD_MONTH_CH2 | 5 |
BUILD_DAY_CH0 | 1 |
BUILD_DAY_CH1 | 4 |
BUILD_HOUR_CH0 | 1 |
BUILD_HOUR_CH1 | 9 |
BUILD_MIN_CH0 | 3 |
BUILD_MIN_CH1 | 4 |
组成版本号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #define VERSION_MAJOR 1
#define VERSION_MINOR 3
#if VERSION_MAJOR > 100
#define VERSION_MAJOR_INIT \
((VERSION_MAJOR / 100) + '0'), \
(((VERSION_MAJOR % 100) / 10) + '0'), \
((VERSION_MAJOR % 10) + '0')
#elif VERSION_MAJOR > 10
#define VERSION_MAJOR_INIT \
((VERSION_MAJOR / 10) + '0'), \
((VERSION_MAJOR % 10) + '0')
#else
#define VERSION_MAJOR_INIT \
(VERSION_MAJOR + '0')
#endif
#if VERSION_MINOR > 100
#define VERSION_MINOR_INIT \
((VERSION_MINOR / 100) + '0'), \
(((VERSION_MINOR % 100) / 10) + '0'), \
((VERSION_MINOR % 10) + '0')
#elif VERSION_MINOR > 10
#define VERSION_MINOR_INIT \
((VERSION_MINOR / 10) + '0'), \
((VERSION_MINOR % 10) + '0')
#else
#define VERSION_MINOR_INIT \
(VERSION_MINOR + '0')
#endif
#define COMLETE_VERSION {\
VERSION_MAJOR_INIT,\
'.',\
VERSION_MINOR_INIT,\
'.',\
BUILD_YEAR_CH2, BUILD_YEAR_CH3,\
BUILD_MONTH_CH0, BUILD_MONTH_CH1,\
BUILD_DAY_CH0, BUILD_DAY_CH1,\
'.',\
BUILD_HOUR_CH0, BUILD_HOUR_CH1,\
BUILD_MIN_CH0, BUILD_MIN_CH1,\
'\0'\
}
|
述代码定义了大版本号为1,小版本号3,然后将编译日期和时间作为版本号的第3第4位。
最后COMLETE_VERSION 为 1.3.200514.1934。
每次编译版本号的第3第4位自动设置为编译日期和时间。