我們希望每次編譯發布程式都有不同的版本號。但是每次編譯都需要修改版本號特別麻煩。本文介紹一種基於編譯時間生成版本號的方法。
c/c++編譯器會內建有兩個獲取編譯時間的巨集:__date__和__time__;
#include int main(void)
輸出:
date : may 14 2020
time : 19:34:54
// example of __date__ string: "may 14 2020"
// 012345678910
#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' : \
/* error default */ '?' \
)#define build_day_ch0 ((__date__[4] >= '0') ? (__date__[4]) : '0')
#define build_day_ch1 (__date__[ 5])
// example of __time__ string: "19:34:54"
// 01234567
#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])
上述**講日期和時間轉化成單個數字表示,方便後續根據特定的格式生成版本號。
轉化後結果如下表:巨集
對應的值
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
#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
// want something like: 1.3.200514.1934
#define comlete_version
述**定義了大版本號為1,小版本號3,然後將編譯日期和時間作為版本號的第3第4位。
最後comlete_version 為 1.3.200514.1934。
每次編譯版本號的第3第4位自動設定為編譯日期和時間。
python 自動生成版本號
本文適用於使用subversion版本控制的讀者.前一段時間研究了一下tortoisesvn的源 發現它使用 nant subwcrev.exe 來自動生成版本號的.subwcrev.exe 是tortoisesvn下的乙個命令列工具,安裝了tortoisesvn 就找到它.這裡補充一下tortoi...
MDK自動生成版本號
mdk編譯工程時自動生成乙個檔案版本號,格式為 v x.x.x build 2021 01 13 11 08 41 by 計算機名 我的操作希望對讀到的小夥伴有幫助!檔案結構是這樣的 test svn mdk proj test.uvprojx getversionnumber svnreion.b...
C 使用 Git 生成編譯版本號
一般而言,我們的軟體版本號通常會包括乙個編譯版本號。如果你的 使用版本控制系統進行管理 很多開發者都是這麼做的 這個編譯版本號可以是我們版本控制系統的提交版本。如果我們使用 git 進行管理,這個版本號會是乙個 40 位的 sha 1 的雜湊值。不過,要是我們的軟體版本號新增這麼乙個 40 位長的字...