使用#if定义(_DEBUG)

时间:2013-12-05 05:19:38

标签: c++ mfc visual-studio-debugging

我正在编写一个基于C ++ MFC的应用程序。偶尔我会添加#if defined(_DEBUG)语句,以便在开发过程中帮助我。我的经理要求我删除所有这些陈述,因为他不想要两个版本的代码。我的感觉是,如果没有使用#if defined(_DEBUG)的能力,在开发过程中bug很可能不会被发现。

有没有人对此有任何想法?

3 个答案:

答案 0 :(得分:2)

嗯,运行时库和MFC有两个版本,debug和release,所以总会有两个版本的代码。

使用#ifdef(_DEBUG)和assert()将帮助您完成调试过程。

但是...

不建议在#ifdef子句中添加类/结构成员,因为对象的二进制接口将是不同的,如果从调试版和发行版中序列化或发送这样的结构,它们将是不同的。 / p>

E.G:

#include <assert.h>

class MyClass
{
    void SetA(int a)
    {
        assert(a<10000); // this is recommended
    }

#ifdef _DEBUG
    int m_debugCounter; // This is not recommended
#endif
};

在示例中,sizeof(MyClass)与调试版和发行版不同。

答案 1 :(得分:2)

使用生产代码编译调试代码有利有弊。

一些优点:

  • 生产可执行文件将更小
  • 不会浪费资源来准备从未使用的日志消息,统计信息等
  • 您可以删除外部库的依赖项(如果它们仅由调试代码
  • 使用)

一些缺点:

  • 您最终得到两个不同的可执行文件
  • 由于某些调试日志在生产版本
  • 中不可用,因此在现场进行故障排除更加困难
  • 存在两个版本的行为不一样的风险。例如,生产版本中可能出现错误,这些错误在测试期间未出现,因为测试是在调试版本中完成的
  • 版本之间存在不兼容的风险,例如格式略有不同的文件(如eranb的回答所示)。

特别是,如果使用编译出的代码(甚至是assert()调用),请务必小心调试代码没有副作用。否则,您将创建在打开调试时消失的错误。

通过使用体面的日志框架,您可以实现至少一些专业人员。例如,我使用rLog取得了一些成功 - 我喜欢它的一个原因是它被优化以最小化休眠日志记录语句的开销。其他更新的日志记录框架提供了类似的功能。

话虽如此,我使用的每个C ++环境至少都有一定程度的编译进/出调试代码。例如,assert()根据NDEBUG宏编译进/出。 ASSERT()/ _DEBUG似乎是该主题的MSVC特定变体(尽管据我所知,MSVC也支持更标准的assert()/ NDEBUG)。

答案 2 :(得分:1)

如果经理想要这个他不明白目标代码质量...... 如果删除#if,您也可以删除任何类型的ASSERT。因为他们只是隐藏#if _DEBUG。 请记住,MFC和CRT本身充满了这个(实际)有用的#if _DEBUG代码!

如果没有这些特殊的_DEBUG块,我将无法针对滥用类或捕获内部问题。