2013-07-06 18 views

Odpowiedz

17

O wy, optymistycznie! Naprawdę nie spodziewałbyś się, że jeden standard zwróci uwagę na inny, prawda? Zdefiniowanie __TIMESTAMP__ nie jest w standardowym C, tak jak jesteś świadomy. Byłoby wspaniale mieć format taki jak proponowany __TIMESTAMP_ISO__ (czy zawsze chciałbyś czas Zulusów, czy byłoby lepiej mieć lokalną strefę czasową przesuniętą?), Ale szczerze mówiąc, najłatwiejszym sposobem na dodanie go może być łatka do GCC i Clang i tak dalej.

Możesz spróbować małpowania z asctime() zgodnie z sugestią user1034749answer, ale wolałbym tego nie próbować.

W GCC 4.8.1 manual, jest interesująca tłumienie ostrzeżenie:

-Wno-builtin-macro-redefined
Nie ostrzec jeśli niektóre wbudowane makra są nowo. To pomija ostrzeżenia dotyczące redefiniowania __TIMESTAMP__, __TIME__, __DATE__, __FILE__ i __BASE_FILE__.

Sugeruje to można spróbować:

gcc ... -Wno-builtin-macro-redefined -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') ... 

Jednak niektóre wcześniejsze wersje GCC nie obsługują opcji; (Uwaga hieroglify niezbędne, aby uzyskać ciąg z date otoczony cudzysłów). Nie przypominam sobie tego wcześniej. Nadal można przedefiniować __TIMESTAMP__:

$ gcc -std=c99 -Wall -Wextra -O xx.c -o xx 
$ ./xx 
Fri Jul 5 19:56:25 2013 
$ gcc -std=c99 -Wall -Wextra -D__TIMESTAMP__=$(date +'"%Y-%m-%dT%H:%M:%S"') -O xx.c -o xx 
<command-line>: warning: "__TIMESTAMP__" redefined 
$ ./xx 
2013-07-05T20:10:28 
$ 

niezbyt ładna, ale działa ... Aha, i tylko dla przypomnienia, że ​​kod źródłowy był (banalne):

#include <stdio.h> 

int main(void) 
{ 
    printf("%s\n", __TIMESTAMP__); 
    return 0; 
} 
+1

Wielkie dzięki! Używam tego w makefile: 'CFLAGS + = -D__TIMESTAMP_ISO __ = $ (shell date -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')' działa jak urok z clang, gcc, icc, itp. :) –

+3

Cieszę się, że działa - powinien. Teoretycznie nie powinieneś używać nazwy zaczynającej się od podwójnego podkreślenia; są zarezerwowane dla "wdrożenia". Jak już zauważyłem, jest mało prawdopodobne, że napotkasz problemy, ale równie dobrze możesz użyć '-DTIMESTAMP_ISO = ...'i być całkowicie wolnymi od ryzyka (kolidować z przyszłymi inkarnacjami" implementacji "). –

+2

:) Będę aktualizować moje użycie, jak polecasz! Również jeśli użyję '-r $ (SRC)' gdzie 'SRC' jest zmienną make dla aktualnie skompilowanego pliku, jak w' CFLAGS + = -DTIMESTAMP_ISO = $ (shell date -r $ (SRC) -u + '" \ "% Y-% m-% dT% H:% M:% SZ \" "')), dokładnie pasuję do oryginalnego zachowania' __TIMESTAMP__'; mianowicie data nie zmienia się w każdej kompilacji, chyba że plik źródłowy został zmodyfikowany przed kompilacją. –

-1

szczęk i GCC stosowane funkcja "C" asctime do tego celu, pewnie ICC stosuje również. W systemie Linux można użyć LD_PRELOAD do przechwycenia połączenia asctime i zastąpić dowolnym żądanym ciągiem znaków.

0

Jeśli potrzebujesz naprawdę wieloplatformowy sposób, aby mieć ciąg znaków kompilacji w formacie ISO 8601 lub dowolny inny format zdefiniowany podczas kompilacji, można zamiast tego rozważyć użycie CMake (co jest zawsze dobre do rozważenia użycia).

Co chcesz can be easily accomplished with CMake.

Powiązane problemy