0%

CPP基于编译时间自动生成版本号

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位自动设置为编译日期和时间。