是否有可能在编译时获得当前时间?

fre*_*ish 2 c++ timestamp constexpr c++14

我正在考虑使用当前时间戳作为一个版本.我想在编译时检索该信息.理想情况下,我想这样做:

constexpr long long currentTimestamp = getCurrentTimestamp();
Run Code Online (Sandbox Code Playgroud)

这可能与C++ 14有关吗?

Rin*_*dov 14

使用标准 C __TIME__宏与__DATE__宏.请参阅此问题以获取示例.

  • @freakish:然后也使用`__DATE__`.为什么不点击链接阅读文档? (4认同)
  • @freakish:使用"构建时间"作为项目的版本似乎是一件奇怪的事情.如果您稍后重建相同的修订版怎么办?你如何区分major.minor分支?你为什么不使用更传统的版本方案?在构建系统中执行此操作,并使用`-D`将生成的数字/字符串/任何内容作为宏传递给您的代码 (2认同)
  • 请注意:这些宏会为每个翻译单元返回值! (2认同)

Pav*_*l P 8

使用__DATE__和__TIME__或__TIMESTAMP__:

#include <stdio.h>

int main()
{
    printf("date: '%s'\n", __DATE__);
    printf("time: '%s'\n", __TIME__);
    printf("timestamp: '%s'\n", __TIMESTAMP__);
}
Run Code Online (Sandbox Code Playgroud)

输出:

date: 'May  5 2017'
time: '00:29:26'
timestamp: 'Fri May  5 00:29:26 2017'
Run Code Online (Sandbox Code Playgroud)

但是,您需要确保重新编译文件,原因很明显.

来自gcc在线文档:

__DATE__

此宏扩展为一个字符串常量,该常量描述预处理器运行的日期.字符串常量包含11个字符,看起来像"1996年2月12日".如果当月的日期小于10,则在左侧填充空格.

__TIME__

此宏扩展为一个字符串常量,该常量描述预处理器的运行时间.字符串常量包含八个字符,看起来像"23:59:01".

__TIMESTAMP__

此宏扩展为一个字符串常量,该常量描述上次修改当前源文件的日期和时间.字符串常量包含星期,月,月中的缩写日,以hh:mm:ss形式,年份的时间,看起来像"Sun Sep 16 01:03:52 1973".如果当月的日期小于10,则在左侧填充空格.

注意,这__TIMESTAMP__不是标准的,有些编译器可能不支持它.