首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用#if defined(_DEBUG)

使用#if defined(_DEBUG)
EN

Stack Overflow用户
提问于 2013-12-05 13:19:38
回答 3查看 2.3K关注 0票数 2

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

其他人对此有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2013-12-05 13:38:29

运行库和MFC有两个版本,调试和发布,所以总是有两个版本的代码。

使用#ifdef(_DEBUG)和assert()将在调试过程中提供帮助。

但是..。

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

例如:

代码语言:javascript
复制
#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)与调试版本和发布版本不同。

票数 2
EN

Stack Overflow用户

发布于 2013-12-05 14:57:35

将调试代码从生产代码编译出来是有好处也有坏处的。

以下是一些优点:

调试产品可执行文件将不会浪费在准备从未使用过的日志消息、统计信息等方面。如果仅由

使用,则您可以删除对外部库的依赖关系

一些缺点:

使用两个不同的executables

  • It会使现场故障排除变得更加困难,因为有些调试日志在生产环境中不可用。version

  • There可能会导致两个版本的行为不同。例如,错误可能出现在生产版本中,但在测试过程中没有出现,因为测试是在调试版本中完成的。

version

  • There存在版本之间不兼容的风险,例如文件的格式略有不同(如eranb的回答中所示)。

特别是,如果使用编译出来的代码(甚至assert()调用),请非常小心,确保调试代码没有副作用。否则,您将创建bugs,这些bugs在打开调试时会消失。

您至少可以通过使用一个像样的日志记录框架来实现一些优点。例如,我在使用rLog时取得了一些成功--我喜欢它的一个原因是它经过优化,可以最大限度地减少休眠日志语句的开销。其他更新的日志框架也提供了类似的功能。

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-05 15:01:29

如果经理想要这个他不理解的目标代码质量...如果应该删除#if,您还可以删除任何类型的断言。因为它们只是隐藏了#if _DEBUG。请记住,MFC和CRT本身充满了这个(真正的)有用的#if _DEBUG代码!

如果没有这种特殊的_DEBUG块,我就不能针对类的误用,或者捕获内部问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20392059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档