C 基於編譯時間自動生成版本號

2021-10-06 04:47:36 字數 4091 閱讀 9667

我們希望每次編譯發布程式都有不同的版本號。但是每次編譯都需要修改版本號特別麻煩。本文介紹一種基於編譯時間生成版本號的方法。

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 位長的字...