Pytanie Osadź znacznik czasu w kodzie wynikowym podczas kompilacji za pomocą C ++


Chcę wykonać printf() wyświetlać, gdy ostatnio wykonywany kod został skompilowany. Czy C / C ++ dostarcza makro, które daje ci odpowiedź na znacznik czasu podczas kompilacji?


31
2018-03-26 21:40


pochodzenie


jakiego kompilatora używasz? - hhafez
Używam g ++ 4.x - theactiveactor


Odpowiedzi:


Możesz użyć __DATE__ i __TIME__.


27
2018-03-26 21:44



Tak, ale działa to tylko w przypadku kompilacji clean / rebuild - Inverse
@Inverse - Możesz zmodyfikować proces kompilacji, aby odtworzyć plik zawierający __DATE__ i __TIME__ makra na każdej kompilacji. - jschmier
To, co robię, to programowanie pliku Makefile touch plik zawierający makro przed kompilacją, aby wymusić jego przebudowanie (najlepiej plik zawierający makra powinien być taki, że niewiele, jeśli inne pliki zależą od niego. - Renan Gemignani


16.8 Wstępnie zdefiniowane nazwy makr [cpp.predefined]
  1 Następujące nazwy makr są określane przez implementację:
__LINE__ Numer linii bieżącego wiersza źródłowego (stała dziesiętna).
__FILE__ Przypuszczalna nazwa pliku źródłowego (literał literowy).
__DATE__ Data tłumaczenia pliku źródłowego (literał literowy postaci "Mmm dd yyyy", gdzie nazwy miesięcy są takie same jak te wygenerowane przez funkcję asctime, a pierwszy znak dd jest spacją, jeśli wartość jest mniejsza niż 10). Jeśli data tłumaczenia nie jest dostępna, dostarczana jest data ważności zdefiniowana przez implementację.
__TIME__ Czas tłumaczenia pliku źródłowego (literał literowy postaci "hh: mm: ss" jak w czasie generowanym przez funkcję asctime). Jeśli czas tłumaczenia nie jest dostępny, dostarczany jest zdefiniowany przez implementację poprawny czas.
__STDC__ Czy __STDC__ jest predefiniowany, a jeśli tak, to jaka jest jego wartość, jest definiowana przez implementację.
__cplusplus Imię __cplusplus jest zdefiniowany do wartości 199711L podczas kompilowania C ++   jednostka tłumaczeniowa.

Chcesz __TIME__ i ewentualnie __DATE__.


19
2018-03-26 21:45



To również działa na C, prawda? - einpoklum
@einpoklum: C ma tę samą listę makr i więcej, z niewielkimi różnicami. Na przykład, __STDC__ jest "stałą całkowitą 1, przeznaczoną do wskazania zgodnej implementacji.", i __cplusplus nigdy nie jest zdefiniowane. Pełna lista w C11 znajduje się w §6.10.8.1. - GManNickG


Użyj makr __DATE__ i __TIME__


5
2018-03-26 21:44





Jeśli używasz preprocesora gcc, to znajdziesz to, czego szukasz w __TIME__ i __DATE__ makra

Cytuj z procesora GNU C doc 

__DATE__

To makro rozwija się do stałej łańcuchowej, która opisuje datę uruchomienia preprocesora. Stała łańcuchowa zawiera jedenaście znaków i wygląda jak "12 lutego 1996". Jeśli dzień miesiąca jest mniejszy niż 10, jest wypełniony spacją po lewej stronie.

__TIME__

To makro rozwija się do stałej łańcuchowej, która opisuje czas, w którym uruchamiany jest preprocesor. Stała napisowa zawiera osiem znaków i wygląda jak "23:59:01".


2
2018-03-26 21:48





Użyj skryptu lub utwórz aplikację, aby wygenerować plik źródłowy C ++ zawierający datę i godzinę kompilacji. Dodaj ten plik do konfiguracji kompilacji. Pozostałe części programu mogą odwoływać się do danych w tym pliku.

Ta technika jest również przydatna do osadzania numeru wersji w programie. Proces budowania może kontrolować numer wersji.


2
2018-03-27 00:23





Wygląda na to, że oczekuje się, że kompilatory zapewnią __TIMESTAMP__ makro, które powinno działać dla twoich celów.


0
2018-03-26 21:44



Od MSDN: __TIMESTAMP__ podaje datę i godzinę ostatniej edycji (!) do pliku (nie czas kompilacji). - sthlm58


Używam tego, aby wysłać wiadomość do DbgView:

    OutputDebugStringA(("ATTACHED VERSION: "+ string(__DATE__) + " " + string(__TIME__)).c_str());

0
2017-12-20 17:03



Tylko wskazówka dla lepszej wydajności: "WERSJA ATAKOWANA:" __DATE__ "" __TIME__ . działa też. - Alexander