简答(问版):(格式 3.33.20150710.182906)
请简单地使用makefile
:
MAJOR = 3
MINOR = 33
BUILD = $(shell date +"%Y%m%d.%H%M%S")
VERSION = "\"$(MAJOR).$(MINOR).$(BUILD)\""
CPPFLAGS = -DVERSION=$(VERSION)
program.x : source.c
gcc $(CPPFLAGS) source.c -o program.x
如果你不想要一个makefile
, 更短的,只需编译:
gcc source.c -o program.x -DVERSION=\"2.22.$(date +"%Y%m%d.%H%M%S")\"
简答(推荐版本):(格式 150710.182906)
使用double
版本号:
生成文件:
VERSION = $(shell date +"%g%m%d.%H%M%S")
CPPFLAGS = -DVERSION=$(VERSION)
program.x : source.c
gcc $(CPPFLAGS) source.c -o program.x
或者一个简单的 bash 命令:
$ gcc source.c -o program.x -DVERSION=$(date +"%g%m%d.%H%M%S")
提示:
仍然不喜欢makefile
或者只是为了一个不那么小的测试程序?添加这一行:
export CPPFLAGS='-DVERSION='$(date +"%g%m%d.%H%M%S")
到你的~/.profile
,记得用gcc $CPPFLAGS ...
长答案:
我知道这个问题比较老,但我有一点贡献。最佳实践始终是自动化可能成为错误(或遗忘)的来源。
我习惯了为我创建版本号的函数。但我更喜欢这个函数返回一个float
. 我的版本号可以通过以下方式打印:printf("%13.6f\n", version());
问题如下:(150710.150411
年(2 位)月日 DOT 小时分秒)。
但是,好吧,问题是你的。如果您更喜欢“major.minor.date.time”,它必须是一个字符串。(相信我,双精度更好。如果您坚持使用专业,如果您设置专业并让小数为日期+时间,您仍然可以使用双精度,例如:major.datetime = 1.150710150411
让我们开始做生意。-DVERSION
如果您像往常一样编译,忘记设置它,或者使用直接从 shell 设置版本,下面的示例将起作用,但更好的是,我推荐第三个选项:使用makefile
.
三种编译形式及结果:
使用制作:
beco> make program.x
gcc -Wall -Wextra -g -O0 -ansi -pedantic-errors -c -DVERSION="\"3.33.20150710.045829\"" program.c -o program.o
gcc program.o -o program.x
跑步:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:29'
VERSION: '3.33.20150710.045829'
使用 -DVERSION:
beco> gcc program.c -o program.x -Wall -Wextra -g -O0 -ansi -pedantic-errors -DVERSION=\"2.22.$(date +"%Y%m%d.%H%M%S")\"
跑步:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:37'
VERSION: '2.22.20150710.045837'
使用内置函数:
beco> gcc program.c -o program.x -Wall -Wextra -g -O0 -ansi -pedantic-errors
跑步:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:43'
VERSION(): '1.11.20150710.045843'
源代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define FUNC_VERSION (0)
6 #ifndef VERSION
7 #define MAJOR 1
8 #define MINOR 11
9 #define VERSION version()
10 #undef FUNC_VERSION
11 #define FUNC_VERSION (1)
12 char sversion[]="9999.9999.20150710.045535";
13 #endif
14
15 #if(FUNC_VERSION)
16 char *version(void);
17 #endif
18
19 int main(void)
20 {
21
22 printf("__DATE__: '%s'\n", __DATE__);
23 printf("__TIME__: '%s'\n", __TIME__);
24
25 printf("VERSION%s: '%s'\n", (FUNC_VERSION?"()":""), VERSION);
26 return 0;
27 }
28
29 /* String format: */
30 /* __DATE__="Oct 8 2013" */
31 /* __TIME__="00:13:39" */
32
33 /* Version Function: returns the version string */
34 #if(FUNC_VERSION)
35 char *version(void)
36 {
37 const char data[]=__DATE__;
38 const char tempo[]=__TIME__;
39 const char nomes[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
40 char omes[4];
41 int ano, mes, dia, hora, min, seg;
42
43 if(strcmp(sversion,"9999.9999.20150710.045535"))
44 return sversion;
45
46 if(strlen(data)!=11||strlen(tempo)!=8)
47 return NULL;
48
49 sscanf(data, "%s %d %d", omes, &dia, &ano);
50 sscanf(tempo, "%d:%d:%d", &hora, &min, &seg);
51 mes=(strstr(nomes, omes)-nomes)/3+1;
52 sprintf(sversion,"%d.%d.%04d%02d%02d.%02d%02d%02d", MAJOR, MINOR, ano, mes, dia, hora, min, seg);
53
54 return sversion;
55 }
56 #endif
请注意,字符串受MAJOR<=9999
和限制MINOR<=9999
。当然,我设置了这个希望永远不会溢出的高值。但是使用仍然更好(另外,它是完全自动的,double
无需手动设置)。MAJOR
MINOR
现在,上面的程序有点太多了。更好的是完全删除该函数,并保证VERSION
定义宏,或者-DVERSION
直接进入 GCC 命令行(或自动添加它的别名,这样你就不会忘记),或者推荐的解决方案,将此过程包含到makefile
.
这是makefile
我使用的:
生成文件源:
1 MAJOR = 3
2 MINOR = 33
3 BUILD = $(shell date +"%Y%m%d.%H%M%S")
4 VERSION = "\"$(MAJOR).$(MINOR).$(BUILD)\""
5 CC = gcc
6 CFLAGS = -Wall -Wextra -g -O0 -ansi -pedantic-errors
7 CPPFLAGS = -DVERSION=$(VERSION)
8 LDLIBS =
9
10 %.x : %.c
11 $(CC) $(CFLAGS) $(CPPFLAGS) $(LDLIBS) $^ -o $@
DOUBLE 的更好版本
现在我向您介绍了“您的”首选解决方案,这是我的解决方案:
使用 (a) makefile 或 (b) gcc 直接编译:
(a) 生成文件:
VERSION = $(shell date +"%g%m%d.%H%M%S")
CC = gcc
CFLAGS = -Wall -Wextra -g -O0 -ansi -pedantic-errors
CPPFLAGS = -DVERSION=$(VERSION)
LDLIBS =
%.x : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDLIBS) $^ -o $@
(b) 或者一个简单的 bash 命令:
$ gcc program.c -o program.x -Wall -Wextra -g -O0 -ansi -pedantic-errors -DVERSION=$(date +"%g%m%d.%H%M%S")
源代码(双版):
#ifndef VERSION
#define VERSION version()
#endif
double version(void);
int main(void)
{
printf("VERSION%s: '%13.6f'\n", (FUNC_VERSION?"()":""), VERSION);
return 0;
}
double version(void)
{
const char data[]=__DATE__;
const char tempo[]=__TIME__;
const char nomes[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
char omes[4];
int ano, mes, dia, hora, min, seg;
char sversion[]="130910.001339";
double fv;
if(strlen(data)!=11||strlen(tempo)!=8)
return -1.0;
sscanf(data, "%s %d %d", omes, &dia, &ano);
sscanf(tempo, "%d:%d:%d", &hora, &min, &seg);
mes=(strstr(nomes, omes)-nomes)/3+1;
sprintf(sversion,"%04d%02d%02d.%02d%02d%02d", ano, mes, dia, hora, min, seg);
fv=atof(sversion);
return fv;
}
注意:这个双重功能只有在你忘记定义宏 VERSION 的情况下才会出现。如果您使用 amakefile
或设置 a alias gcc gcc -DVERSION=$(date +"%g%m%d.%H%M%S")
,您可以安全地完全删除此功能。
嗯,就是这样。一种非常简洁且简单的方法来设置您的版本控制,再也不用担心它了!