Krótka odpowiedź (wersja poproszony): (format 3.33.20150710.182906)
Proszę prosty Użyj makefile
z:
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
a jeśli nie chcesz makefile
, jeszcze krócej , po prostu skompilować z:
gcc source.c -o program.x -DVERSION=\"2.22.$(date +"%Y%m%d.%H%M%S")\"
Krótka odpowiedź (wersja sugerowane): (format +150.710,182906)
Użyj double
dla numeru wersji:
Makefile:
VERSION = $(shell date +"%g%m%d.%H%M%S")
CPPFLAGS = -DVERSION=$(VERSION)
program.x : source.c
gcc $(CPPFLAGS) source.c -o program.x
Albo prosta komenda bash:
$ gcc source.c -o program.x -DVERSION=$(date +"%g%m%d.%H%M%S")
Wskazówka: Still don Czy podoba ci się makefile
czy jest to tylko dla niezbyt małego programu testowego?Dodaj tę linię:
export CPPFLAGS='-DVERSION='$(date +"%g%m%d.%H%M%S")
do ~/.profile
i pamiętaj skompilować z gcc $CPPFLAGS ...
Długa odpowiedź:
Wiem, że to pytanie jest starszy, ale mam mały wkład robić. Najlepszą praktyką jest zawsze automatyzacja, co w przeciwnym razie może stać się źródłem błędu (lub zapomnienia).
Przywykłem do funkcji, która utworzyła dla mnie numer wersji. Ale wolę tę funkcję, aby zwrócić wartość float
. Mój numer wersji może być wydrukowany przez: , która wydaje coś w rodzaju: 150710.150411
(jako Rok (2 cyfry) miesiąc dzień DOT godzina minuta sekund).
Ale, cóż, pytanie należy do ciebie. Jeśli wolisz "major.minor.date.time", musi to być ciąg znaków. (Zaufaj mi, podwójne jest lepsze.Jeśli nalegasz na majora, nadal możesz użyć podwójnego, jeśli ustawisz major i pozwól, aby ułamki dziesiętne były datami + czasem, np .: major.datetime = 1.150710150411
Przejdźmy do biznesu. będzie działać, jeśli kompilacji jak zwykle, zapominając, aby ustawić go lub użyj -DVERSION
ustawić wersję bezpośrednio z powłoki, ale lepiej wszystkim polecam trzecią opcję: użyj makefile
trzy formy. kompilacja i wyniki:
Korzystanie zrobić:
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
Bieg:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:29'
VERSION: '3.33.20150710.045829'
Korzystanie -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")\"
Bieg:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:37'
VERSION: '2.22.20150710.045837'
Korzystanie z funkcji build-in:
beco> gcc program.c -o program.x -Wall -Wextra -g -O0 -ansi -pedantic-errors
Bieg:
__DATE__: 'Jul 10 2015'
__TIME__: '04:58:43'
VERSION(): '1.11.20150710.045843'
kod źródłowy
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
Należy pamiętać, że ciąg znaków jest ograniczony przez MAJOR<=9999
i MINOR<=9999
. Oczywiście ustawiłem tę wysoką wartość, która, mam nadzieję, nigdy się nie przepełni. Ale używanie double
jest jeszcze lepsze (plus, jest to całkowicie automatyczne, nie trzeba ręcznie ustawiać MAJOR
i MINOR
).
Teraz powyższy program jest nieco za duży. Lepiej jest całkowicie usunąć funkcję i zagwarantować, że makro VERSION
jest zdefiniowane, albo przez -DVERSION
bezpośrednio w wierszu poleceń GCC (lub alias, który automatycznie dodaje go, aby nie można było zapomnieć), lub zalecane rozwiązanie, aby uwzględnić ten proces w makefile
.
Tu jest makefile
używam: źródło
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 [email protected]
lepszą wersję z podwójnym
Teraz, kiedy przedstawiane ty "swoją" korzystne rozwiązanie, tutaj jest moje rozwiązanie:
skompilować z (a) makefile lub (b) gcc bezpośrednio:
(a) Makefile:
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 [email protected]
(b) lub proste polecenia bash:
$ gcc program.c -o program.x -Wall -Wextra -g -O0 -ansi -pedantic-errors -DVERSION=$(date +"%g%m%d.%H%M%S")
Kod źródłowy (wersja podwójna):
#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;
}
Uwaga: Ta podwójna funkcja istnieje tylko w przypadku, gdy zapomnisz zdefiniować makro WERSJA. Jeśli używasz makefile
lub ustawisz alias gcc gcc -DVERSION=$(date +"%g%m%d.%H%M%S")
, możesz bezpiecznie usunąć tę funkcję całkowicie.
Cóż, to wszystko. Bardzo schludny i łatwy sposób na skonfigurowanie kontroli wersji i nigdy więcej się nią nie przejmujesz!
Twój '_VERSION' makro narusza zasadę identyfikator, który począwszy od znaku podkreślenia, po którym następuje litera jest zarezerwowana dla realizacji . – chris
@chris: Zmieniam identyfikator. Włożę coś jeszcze. inna zmienna "VERSION" już istnieje w moim kodzie, więc zastanawiam się, co można zrobić. – Rick2047
Dopóki nie zaczyna się od dwóch podkreśleń, powinieneś być w porządku. – chris