【问题标题】:TRACE Macro Not Compiled Out Properly in Release Build - C++发布版本中未正确编译出 TRACE 宏 - C++
【发布时间】:2010-12-14 16:40:56
【问题描述】:

当我对我的 Visual Studio 2008 解决方案进行发布构建时,我遇到了一堆这样的错误:

错误 C2059:语法错误:','

这就是我通常使用TRACE的方式:

TRACE(_T("My error message.\r\n\tError: %d\r\n\tFile: %s\r\n\tLine: %d\r\n"), ::GetLastError(), __WFILE__, __LINE__);

还有一个实例,我将它与 5 个参数一起使用。

我认为TRACE 应该完全编译为发布版本。我需要做什么才能使其编译完成?谢谢。

【问题讨论】:

  • 我不确定。您还遇到了哪些其他错误?
  • 帖子中描述的错误是我得到的唯一一个,一大堆,每次使用TRACE时出现一次。
  • __WFILE__ 的定义是否正确?您可以通过预处理传递来检查...
  • (1) 如果您注释掉这一行,您会得到同样的错误吗? (2)__WFILE__在哪里以及如何定义?它不是 VS2008 AFAICT 的标准部分。 (3)如果你用_T(__FILE__)代替__WFILE__呢?
  • @lijie:在调试中 WFILE 被定义为#define __WFILE__ (L ## __FILE__)。在 Release 中,它被简单地定义为 #define __WFILE__

标签: c++ visual-studio-2008 trace release-builds


【解决方案1】:

__WFILE__ 宏的定义导致了问题。有两种方法可以解决这个问题。首先,您可以定义如下所示的宏:

http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

请注意,它们不会将宏包装在 #ifdef _DEBUG 中,这是有道理的,因为相应的 __FILE__ 宏在发布模式下也不会被删除。

但该文档适用于 VS2005。它已从较新版本的文档中删除。这就是您可能想要这样做的原因:

_T(__FILE__)

【讨论】:

    【解决方案2】:

    首先,据我所知是__FILE__,而不是__WFILE__。这就是您收到逗号错误的原因。由于预处理器无法找到它。

    第二,为什么要在每个TRACE中写最后三个参数? TRACE 是一个宏,对吧?

    所以你可以这样定义它:(另见define __WFILE__宏)

    #define FULL_TRACE   //define FULL_TRACE here
    #define __WFILE__  L##__FILE__ //since __WFILE__ is not a real macro in MCVC++
    #define TRACE(msg) FULL_TRACE(msg, ::GetLastError(), __WFILE__, __FUNCTION__, __LINE__)
    

    现在,你可以像这样追踪

    TRACE("Error in I/O file")
    

    你就完成了!

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      相关资源
      最近更新 更多