像__TIME__这样的C ++预处理程序指令有时不会更改/不会更新

时间:2011-12-28 15:58:14

标签: c++ visual-c++ c-preprocessor fopen

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

fprintf(fp,"%s %s %s %s %d %s\n", 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);
}

2 个答案:

答案 0 :(得分:8)

问题是你没有进行重建。

默认情况下,Visual Studio仅构建/编译自上次编译项目以来已更改(已修改)的源文件。这是为了节省时间,这是一个非常有用的功能。如果您想确保重新编译源文件,无论它们自上次构建后是否已被更改,您必须指示VS 重建您的代码(或通过歌曲和舞蹈做一个干净的,然后建立你的项目)。

重要的原因是__TIME__ preprocessor macro在预处理期间(在编译之前发生,<至少为了我们的目的)在当前时间扩展。它扩展了编译代码的第一次时间,除非您修改源文件或重新编译(重建)它,否则永远不会更改。

这可能不是您在日志记录功能中寻找的内容。您需要打印当前的系统时间,而不是编译时间。您可以使用time function获取它 - 使用它,确保在源文件的顶部包含<time.h>。或者,如果您已经包含<windows.h>,则可以致电GetSystemTime function填写SYSTEMTIME structure,以便为您提供当前时间日期。

答案 1 :(得分:2)

__TIME__

  

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

此定义来自Predefined Macros

要获取当前时间,您可以使用time()或其他类似功能。