在Visual C++可执行文件中输出编译时间戳?

17 c++ execution compile-time visual-c++

如何将编译时间戳信息插入到使用Visual C++ 2005构建的可执行文件中?我希望能够在执行程序时输出类似的内容:

这个版本XXXX编译为dd-mm-yy,hh:mm.

其中日期和时间反映了项目建立的时间.它们不应随着程序的每次连续调用而改变,除非它被重新编译.

Jim*_*uck 19

虽然不是您的确切格式,但DATE的格式为Mmm dd yyyy,而TIME的格式为hh:mm:ss.您可以创建这样的字符串,并在任何对您有意义的打印例程中使用它:

const char *buildString = "This build XXXX was compiled at " __DATE__ ", " __TIME__ ".";
Run Code Online (Sandbox Code Playgroud)

(另请注意:TIMESTAMP仅吐出源文件的修改日期/时间,而不是构建日期/时间.)


spa*_*kes 8

__DATE__ 
__TIME__
Run Code Online (Sandbox Code Playgroud)

被预定义为C99标准的一部分,因此您应该可以使用.它们与预处理器运行一次.


Joe*_*der 6

__TIME__并且__DATE__可以工作,但是存在一些并发症。

如果将这些定义放在 .h 文件中,并包含多个 .c/.cpp 文件中的定义,则每个文件将根据编译时间而具有不同版本的日期/时间。因此,如果您希望在两个不同的地方使用日期/时间,并且它们应该始终匹配,那么您就有麻烦了。如果您正在进行增量构建,其中一个文件可能会被重建,而另一个则不会,这又会导致时间戳可能大不相同。

稍微好一点的方法是在 .h 文件中制作 GetBuildTimeStamp() 原型,并将__TIME____DATE__宏放在实现(.c/.cpp)文件中。这样您就可以在代码中的多个位置使用时间戳,并且它们将始终匹配。但是,您需要确保每次执行构建时都会重建 .c/.cpp 文件。如果您正在进行干净的构建,那么此解决方案可能适合您。

如果您正在进行增量构建,那么您需要确保每次构建时都会更新构建标记。在 Visual C++ 中,您可以使用 PreBuild 步骤来完成此操作 - 但在这种情况下,我建议您不要在已编译的 .c/.cpp 文件中使用__DATE__and __TIME__,而是使用在程序运行时在运行时读取的基于文本的文件。执行。这使得您的构建脚本可以快速更新时间戳(无需编译或链接),并且不需要您的 PreBuild 步骤来了解编译器标志或选项。


Mat*_*chi 5

嗯...对于Visual C++,有一个内置的符号叫做__ImageBase.特别:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

您可以在运行时检查它以确定PE头中的时间戳:

const IMAGE_NT_HEADERS *nt_header= (const IMAGE_NT_HEADERS *)((char *)&__ImageBase + __ImageBase.e_lfanew);

nt_header->FileHeader.TimeDateStamp用来获取时间戳,即从1970年1月1日起的秒数.