如何找出编译源代码的日期?

时间:2015-04-01 08:20:40

标签: c++ date compilation

是否可以存储和显示我的项目编译日期?

我想在程序启动时打印此日期,以便了解使用的版本。目前,我手工做这个,这很麻烦。

我正在使用Visual Studio 2010。

5 个答案:

答案 0 :(得分:8)

C ++指定有一个名为__DATE__的特殊预处理器宏,它是编译发生时的字符串文字。还有相应的__TIME__宏。

您可以使用:

const std::string compilation_date = __DATE__;
const std::string compilation_time = __TIME__;

...

std::cout << "This source file was compiled on date " << compilation_date
          << " and at the time " << compilation_time << '\n';

答案 1 :(得分:5)

您可以使用__DATE____TIME__ macros - see "Predefined macros" here

作为样本,如下所示:

#include <iostream>
int main()
{
    using namespace std;
    cout << "Compiled on: " << __DATE__ << endl;
    cout << "Compiled at: " << __TIME__ << endl;
}

您可以根据需要修改消息并使用。

您甚至可以将其构建为更大的宏或命名变量。

#include <iostream>
const char* const COMPILED = __DATE__ " @ " __TIME__;
int main()
{
    using namespace std;
    cout << "Compiled: " << COMPILED << endl;
}

如果“版本”信息与源控件位置或数据(例如提交编号)相关联,那么通过某种构建步骤或命令行定义将该数据包含在构建中也可能是一个想法。您还应该考虑增量构建对日期和时间的影响。我假设“发布”版本不是基于增量的,或者如果是这样,在包含日期和时间数据的文件上有“触摸”。

答案 2 :(得分:2)

这有两个部分。第一个(已经在答案中提到)是使用__DATE__。不幸的是,这只会告诉您翻译单元的编译日期。如果您想要最后一个Visual Studio Build的日期,则需要强制重建包含__DATE__

的翻译单元

一个简单的解决方案是始终更新该翻译单元的文件时间。假设你想要Joachim的解决方案,那么你用

创建一个单独的builddate.cpp文件
const std::string compilation_date = __DATE__;
const std::string compilation_time = __TIME__;

在帖子构建步骤中,请致电copy /b builddate.cpp+,,。这意味着在每次构建之后,builddate.cpp文件变得比可执行文件更新,并将在下一次构建时重新编译。

在Linux上,您可以使用touch

答案 3 :(得分:1)

您的问题表明您没有使用版本控制系统。你应该,没有任何借口,比如“我的项目太小了我以后会做更大的事情”或“太复杂”。每个开发人员都必须使用VCS,当你开始使用它时,如果没有它,你将无法想象你的生活方式。因此,当您开始使用VCS时,您的问题将是“如何将comit或标签版本放入源代码?”例如,在svn上你可以使用:

const char *version = "$Id:$";

和svn会将其更改为当前提交版本。对于其他VCS系统,解决方案可能不同但接近,因为这个问题很常见。

答案 4 :(得分:0)

有一个名为

的宏
__DATE__

解决了“2015年4月1日”之类的问题。人们可以使用它。它是标准的预定义宏。

  

__ DATE __:       此宏扩展为一个字符串常量,该常量描述预处理器运行的日期。字符串常量包含11个字符,看起来像“1996年2月12日”。如果当月的日期小于10,则在左侧填充空格。如果GCC无法确定当前日期,它将发出警告信息(每次编译一次), DATE 将扩展为“??? ?? ????”。 https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

但是,此解决方案缺少格式化。当然,你可以解析它,但也许有一个更简单,更像C ++的解决方案。