Вставить метку времени в объектный код во время компиляции с C++
Я хочу выполнить printf()
чтобы отобразить, когда исполняемый код был скомпилирован в последний раз. Предоставляет ли C/C++ макрос, который дает вам разрешение во время компиляции?
8 ответов
16.8 Предопределенные имена макросов [cpp.predefined]
1 Следующие имена макросов должны быть определены реализацией:__LINE__
Номер строки текущей исходной строки (десятичная константа).__FILE__
Предполагаемое имя исходного файла (символьная строка-литерал).__DATE__
Дата перевода исходного файла (строковый литерал в форме "Mmm dd yyyy", где названия месяцев совпадают с названиями месяцев, сгенерированными функцией asctime, а первый символ dd является пробелом, если значение меньше 10). Если дата перевода недоступна, указывается действительная дата, определенная реализацией.__TIME__
Время трансляции исходного файла (символьный строковый литерал вида "чч: мм: сс", как во времени, сгенерированном функцией asctime). Если время перевода недоступно, указывается допустимое время, определенное реализацией.__STDC__
Будь то__STDC__
является предопределенным, и если да, то каково его значение, определяется реализацией.__cplusplus
Имя__cplusplus
определяется значением 199711L при компиляции модуля перевода C++.
Ты хочешь __TIME__
и, возможно, __DATE__
,
Если вы используете препроцессор gcc, то вы найдете то, что вы ищете в __TIME__
а также __DATE__
макрос
Цитата из GNU C Процессор док
__DATE__
Этот макрос раскрывается в строковую константу, которая описывает дату запуска препроцессора. Строковая константа содержит одиннадцать символов и выглядит как "12 февраля 1996". Если день месяца меньше 10, он дополняется пробелом слева.
__TIME__
Этот макрос расширяется до строковой константы, которая описывает время, в которое запускается препроцессор. Строковая константа содержит восемь символов и выглядит как "23:59:01".
Используйте сценарий или создайте приложение, чтобы сгенерировать исходный файл C++, содержащий дату и время сборки. Добавьте этот файл в настройку сборки. Другие части программы могут ссылаться на данные в этом файле.
Этот метод также полезен для встраивания номера версии в программу. Процесс сборки может контролировать номер версии.
Похоже, что компиляторы должны обеспечить __TIMESTAMP__
макрос, который должен работать для ваших целей.
Я использую это для отправки сообщения в DbgView:
OutputDebugStringA(("ATTACHED VERSION: "+ string(__DATE__) + " " + string(__TIME__)).c_str());
Вы можете добавить строку ниже в CMakeLists.txt
string(TIMESTAMP COMPILE_TIME %Y%m%d-%H%M%S)
и
вам нужно добавить строку ниже в файл «ProjectName.h.in»
#define TIMESTAMP @COMPILE_TIME@
тогда, когда вы скомпилируете свой проект, приведенная ниже строка будет записана в вашем «ProjectName.h»
#define TIMESTAMP 20230220-203532