可视C++预处理器指令(如__TIME__有时不会更改/未更新)

visual C++ preprocessor directives like __TIME__ sometimes don't change/aren't updated

本文关键字:更新 处理器 预处理 C++ 指令 TIME 可视      更新时间:2023-10-16

我使用的是Visual Studio 2008 Express,我有这个日志代码:

fprintf(fp,"%s %s %s %s %d %sn", pType, __DATE__, __TIME__, pFileName, lineNo, pMsg.c_str());
fflush(fp);

有时,如果我不删除日志,只是继续添加它,__TIME__宏只是继续打印旧时间,而不是当前时间。

我使用以下代码打开文件
if(pfileName != NULL)
{
    fp = fopen(pfileName, "a+");
    if(fp != NULL)
        fseek(fp, 0, SEEK_END);
}

问题是你没有做重建。

默认情况下,Visual Studio只构建/编译自上次编译项目以来更改(已修改)的源文件。这是为了节省时间,这是一个非常有用的功能。如果你想确保源文件被重新编译,不管它们自上次构建以来是否被更改,你必须指示VS 重新编译你的代码(或者经历一次清理,然后在你的项目上进行构建)。

这很重要的原因是__TIME__预处理器宏在预处理期间(这发生在编译之前,至少对于我们这里的目的而言)用当前时间展开。它在你编译代码的第一个得到扩展,并且永远不会被改变,除非你修改源文件或重新编译(重建)它。

这可能不是您在日志记录函数中寻找的。您希望打印当前系统时间,而不是编译时间。您可以使用time函数来获得它——要使用它,请确保在源文件的顶部包含<time.h>。或者,如果您已经包含了<windows.h>,您可以调用GetSystemTime函数来填充SYSTEMTIME结构,该结构提供当前时间日期。

__TIME__ is

当前源文件的最近编译时间。时间是hh:mm:ss形式的字符串字面值。

这个定义来自预定义宏。

要获取当前时间,可以使用time()或其他类似的函数。