Внедрение временной метки в объектный код во время компиляции с помощью C++

Я хочу выполнить printf() для отображения, когда текущий исполняемый код был в последний раз скомпилирован. Предоставляет ли C/C++ макрос, который дает вам временную метку во время компиляции?


person theactiveactor    schedule 26.03.2010    source источник
comment
какой компилятор вы используете?   -  person hhafez    schedule 27.03.2010


Ответы (7)


Вы можете использовать __DATE__ и __TIME__.

person dalle    schedule 26.03.2010
comment
@Inverse. Вы можете изменить процесс сборки, чтобы воссоздавать файл, содержащий макросы __DATE__ и __TIME__, при каждой компиляции. - person jschmier; 27.03.2010
comment
Что я делаю, так это программирую make-файл на touch файл, содержащий макрос, перед компиляцией, чтобы принудительно его пересобрать (в идеале, файл, содержащий макросы, должен быть таким, чтобы от него зависели лишь немногие другие файлы, если таковые имеются). - person Renan Gemignani; 06.12.2013

16.8 Предопределенные имена макросов [cpp.predefined]
1 Следующие имена макросов должны быть определены реализацией:
__LINE__ Номер строки текущей исходной строки (десятичная константа).
__FILE__ Предполагаемое имя исходного файла (литерал строки символов).
__DATE__ Дата перевода исходного файла (литерал строки символов в форме "Ммм дд гггг", где названия месяцев совпадают с именами, сгенерированными asctime, а первым символом dd является пробел, если значение меньше 10). Если дата перевода недоступна, предоставляется действительная дата, определяемая реализацией.
__TIME__ Время перевода исходного файла (литерал символьной строки в форме «чч:мм:сс», как и в сгенерированном времени функцией asctime). Если время перевода недоступно, предоставляется действительное время, определенное реализацией.
__STDC__ Предопределено ли __STDC__, и если да, то каково его значение, определяется реализацией.
__cplusplus Имя __cplusplus определяется как значение 199711L при компиляции единицы трансляции C++.

Вы хотите __TIME__ и, возможно, __DATE__.

person GManNickG    schedule 26.03.2010
comment
@einpoklum: C имеет тот же список макросов и даже больше, с некоторыми небольшими отличиями. Например, __STDC__ — это целочисленная константа 1, предназначенная для обозначения соответствующей реализации, а __cplusplus никогда не определяется. Полный список в C11 находится в §6.10.8.1. - person GManNickG; 31.08.2016

Используйте макросы __DATE__ и __TIME__

person FRotthowe    schedule 26.03.2010

Если вы используете препроцессор gcc, вы найдете то, что ищете, в макросах __TIME__ и __DATE__.

Цитаты из препроцессора GNU C документация:

__ДАТА__

Этот макрос преобразуется в строковую константу, описывающую дату запуска препроцессора. Строковая константа содержит одиннадцать символов и имеет вид «12 февраля 1996 года». Если число месяца меньше 10, оно дополняется пробелом слева.

...

__ВРЕМЯ__

Этот макрос преобразуется в строковую константу, описывающую время запуска препроцессора. Строковая константа содержит восемь символов и имеет вид «23:59:01».

person hhafez    schedule 26.03.2010
comment
Просто хочу отметить: это не имеет ничего общего с GCC. Это стандартная вещь. Так что вы правы в том, что макросы такие, как вы говорите, но они не только для GCC. - person Pryftan; 29.02.2020

Используйте сценарий или создайте приложение для создания исходного файла C++, содержащего дату и время сборки. Добавьте этот файл в настройки сборки. Другие части программы могут ссылаться на данные в этом файле.

Этот метод также полезен для внедрения номера версии в программу. Процесс сборки может управлять номером версии.

person Thomas Matthews    schedule 27.03.2010

Похоже, компиляторы должны предоставить макрос __TIMESTAMP__, который должен работать для ваших целей.

person jwismar    schedule 26.03.2010
comment
Из MSDN: __TIMESTAMP__ указывает дату и время последнего редактирования ( !) сделан в файл (не время компиляции). - person sthlm58; 10.10.2013

Я использую это для отправки сообщения в DbgView:

    OutputDebugStringA(("ATTACHED VERSION: "+ string(__DATE__) + " " + string(__TIME__)).c_str());
person jamacoe    schedule 20.12.2016
comment
Просто подсказка для лучшей производительности: ПРИКРЕПЛЕННАЯ ВЕРСИЯ: __DATE__ __TIME__ . тоже работает. - person Alexander; 23.03.2017