使用C++在编译时将时间戳嵌入目标代码

43

我想使用 printf() 函数显示当前正在执行的代码上次编译的时间戳。在 C/C++ 中是否提供一个宏来解析为编译期间的时间戳?


你使用的编译器是哪个? - hhafez
如果您想解析它,这将非常有用。https://dev59.com/7nI-5IYBdhLWcg3wm5vN#30129950 - parsley72
8个回答

41

您可以使用__DATE____TIME__


6
您可以修改构建过程,以便在每次编译时重新创建一个文件,其中包含__DATE____TIME__宏。 - jschmier
3
我会尽力进行翻译,以下是需要翻译的内容:我的做法是在编译之前通过程序化Makefile指令来“touch”包含宏的文件,以强制重新构建它(理想情况下,包含宏的文件应该是很少或者没有其他文件依赖的)。 - Renan Gemignani

32

16.8 预定义的宏名称 [cpp.predefined]
1 实现必须定义以下宏名称:
__LINE__ 当前源代码行号(十进制常量)。
__FILE__ 源文件的推测名称(一个字符字符串字面值)。
__DATE__ 源文件的翻译日期(形如 "Mmm dd yyyy" 的字符字符串字面值,其中月份的名称与 asctime 函数生成的相同,如果 dd 的值小于 10,则 dd 的第一个字符是空格字符)。 如果没有可用的翻译日期,则提供实现定义的有效日期。
__TIME__ 源文件的翻译时间(形如 "hh:mm:ss" 的字符字符串字面值,与 asctime 函数生成的时间相同)。 如果没有可用的翻译时间,则提供实现定义的有效时间。
__STDC__ 是否预定义了 __STDC__ 及其值是什么,由实现定义。
__cplusplus 在编译 C++ 翻译单元时,名称 __cplusplus 被定义为值 199711L。

您需要使用 __TIME__ 和可能是 __DATE__


1
@einpoklum:C语言有相同的宏列表,还有一些细微的差别。例如,__STDC__是“整数常量1,旨在表示符合实现”,而__cplusplus则从未定义。C11中完整的列表在§6.10.8.1中。 - GManNickG

8

使用宏__DATE____TIME__


6
如果您正在使用gcc预处理器,则可以在__TIME____DATE__宏中找到您要查找的内容。
引用自GNU C预处理器documentation
__DATE__ 此宏展开为一个字符串常量,描述了预处理器运行的日期。该字符串常量包含11个字符,看起来像“Feb 12 1996”。如果月份中的日期少于10,则在左侧填充一个空格。
__TIME__ 此宏展开为一个字符串常量,描述了预处理器运行的时间。该字符串常量包含8个字符,看起来像“23:59:01”。

只是想指出:这与GCC无关。这是一个标准的事情。所以你说的宏是正确的,但不仅适用于GCC。 - Pryftan

2
使用脚本或创建应用程序生成一个包含构建日期和时间的C++源文件。将此文件添加到构建设置中。程序的其他部分可以引用此文件中的数据。
此技术还可用于将版本号嵌入程序中。构建过程可以控制版本号。

0

看起来编译器应该提供一个__TIMESTAMP__宏,这对你的目的应该有效。


8
MSDN__TIMESTAMP__提供了文件上次编辑的日期和时间(而不是编译时间)。 - sthlm58

0
我正在使用这个来向 DbgView 发送消息:
    OutputDebugStringA(("ATTACHED VERSION: "+ string(__DATE__) + " " + string(__TIME__)).c_str());

6
提升性能的小提示:“附加版本:”__DATE__“ ”__TIME__“也可以使用。” - Alexander

-1

您可以将以下字符串添加到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

OP从未提到使用CMake... 此外,你需要在你的cmake中添加更多内容,而且那将是CMake运行的最后一次,而不是编译时。 - ChrisMM
嗯,你能否详细说明一下“你的cmake需要比你发布的更多”这句话的意思?@ChrisMM - pi_ka_qiu_1999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接