【发布时间】:2011-02-01 09:16:06
【问题描述】:
我想执行printf() 来显示当前执行的代码最后一次编译的时间。 C/C++ 是否提供了一个宏,可以让您在编译期间解析为时间戳?
【问题讨论】:
-
你使用的是哪个编译器?
-
如果你想解析它很有用stackoverflow.com/a/30129950/264822
标签: c++ build timestamp versioning
我想执行printf() 来显示当前执行的代码最后一次编译的时间。 C/C++ 是否提供了一个宏,可以让您在编译期间解析为时间戳?
【问题讨论】:
标签: c++ build timestamp versioning
您可以使用__DATE__ 和__TIME__。
【讨论】:
__DATE__ 和 __TIME__ 宏的文件。
touch在编译之前包含宏的文件以强制其重建(理想情况下,包含宏的文件应该很少,如果有其他文件的话靠它。
16.8 预定义的宏名称 [cpp.predefined]
1 以下宏名称应由实现定义:__LINE__当前源行的行号(十进制常量)。__FILE__源文件的假定名称(字符串文字).__DATE__源文件的翻译日期(“Mmm dd yyyy”形式的字符串文字,其中月份的名称与asctime函数生成的月份名称相同,第一个如果值小于 10,则 dd 的字符为空格字符)。如果翻译日期不可用,则提供实现定义的有效日期。__TIME__源文件的翻译时间(格式为“hh:mm:ss”的字符串文字,如asctime 函数生成的时间)。如果翻译时间不可用,则提供实现定义的有效时间。__STDC____STDC__是否是预定义的,如果是,它的值是什么,是实现定义的。__cplusplus在编译 C++ 时,名称__cplusplus定义为值 199711L 翻译单元。
你想要__TIME__,可能还有__DATE__。
【讨论】:
__STDC__ 是“整数常量 1,用于指示符合要求的实现。”,而__cplusplus 从未定义。 C11 中的完整列表位于 §6.10.8.1。
使用宏 __DATE__ 和 __TIME__
【讨论】:
如果您使用 gcc 预处理器,那么您将在 __TIME__ 和 __DATE__ 宏中找到您要查找的内容
来自 GNU C 预处理器 documentation 的引述:
__DATE__
此宏扩展为一个字符串常量,描述预处理器运行的日期。字符串常量包含 11 个字符,看起来像“Feb 12 1996”。如果月份中的日期小于 10,则在左侧用空格填充。
...
__TIME__
此宏扩展为一个字符串常量,描述预处理器运行的时间。字符串常量包含八个字符,看起来像“23:59:01”。
【讨论】:
使用脚本或创建应用程序来生成包含构建日期和时间的 C++ 源文件。将此文件添加到构建设置中。程序的其他部分可以引用该文件中的数据。
此技术对于将版本号嵌入程序也很有用。构建过程可以控制版本号。
【讨论】:
看起来编译器应该提供一个__TIMESTAMP__ 宏,它应该可以满足您的目的。
【讨论】:
__TIMESTAMP__ 为您提供上次编辑 (!) 文件的日期和时间(不是编译时间)。
我正在使用它向 DbgView 发送消息:
OutputDebugStringA(("ATTACHED VERSION: "+ string(__DATE__) + " " + string(__TIME__)).c_str());
【讨论】:
__DATE__ " " __TIME__ 。也可以。