C++ 我怎样才能知道编译源代码的日期?

C++ 我怎样才能知道编译源代码的日期?,c++,date,compilation,C++,Date,Compilation,是否可以存储和显示项目编译的日期 我想在程序启动时打印这个日期,以便知道使用哪个版本。目前,我是手工做这件事的,这相当麻烦 我使用的是Visual Studio 2010。C++指定有一个名为\uuuu DATE\uuuu的特殊预处理器宏,它是编译发生时的字符串文本。还有一个相应的\uuuuuuuuuuuuuuu宏 您可以在以下位置使用: const std::string compilation_date = __DATE__; const std::string compilation_ti

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

我想在程序启动时打印这个日期,以便知道使用哪个版本。目前,我是手工做这件事的,这相当麻烦


我使用的是Visual Studio 2010。

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

您可以在以下位置使用:

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';
const std::字符串编译\u日期=\u日期\u;
const std::字符串编译时间=\uuuuuuu时间\uuuuuuu;
...

std::cout您可以使用
日期和
时间

作为示例,如下所示:

#include <iostream>
int main()
{
    using namespace std;
    cout << "Compiled on: " << __DATE__ << endl;
    cout << "Compiled at: " << __TIME__ << endl;
}
#包括
int main()
{
使用名称空间std;

cout有一个宏名为

__DATE__
解析为“2015年4月1日”。你可以直接使用它。它是一个标准的预定义宏

__日期: 此宏扩展为一个字符串常量,用于描述运行预处理器的日期。该字符串常量包含11个字符,看起来像“1996年2月12日”。如果月份的日期小于10,则在左侧用空格填充。如果GCC无法确定当前日期,它将发出警告消息(每次编译一次)和日期将扩展到“?”


<>但是,这个解决方案没有格式化。当然,你可以解析它,但是也许有一个更简单,更类似C++的解决方案。

有两个部分。第一个(已经在答案中提到)是使用

\uuuuu DATE\uuuuuu
。不幸的是,这只会告诉您该翻译单元的编译日期。如果您想要上一次Visual Studio生成的日期,则需要强制重新生成包含
\uuuu DATE\uuuuuu

一个简单的解决方案是始终更新该翻译单元的文件时间

const std::string compilation_date = __DATE__;
const std::string compilation_time = __TIME__;
在生成后步骤中,调用。这意味着在每次生成之后,builddate.cpp文件将比可执行文件更新,并将在下一次生成时重新编译


在Linux上,你可以使用
touch

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

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

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

编译日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期日期t并重新编译。你应该做的是使用类似系统的方法并使用唯一的提交ID。你知道在git中如何做到这一点吗?@Fabian请注意,你需要在项目树根目录上设置svn属性svn:keywords。另一种方法是在构建二进制文件后修补它们,以直接编辑常量字符串全局变量e符号,例如使用binutils和dd。优点是您不必进行任何代价高昂的重新链接。最好使用const char编译[]因此,您可以通过符号查找在二进制文件中找到字符串,而无需运行程序。您还可以避免重新链接二进制文件,并直接使用binutils和dd编辑字符串。最好使用const char compilation[]因此,您可以通过符号查找在二进制文件中找到字符串,而无需运行程序。您还可以避免重新链接二进制文件,并直接使用binutils和dd编辑字符串。
const char *version = "$Id:$";