我正在编写一个基于C ++ MFC的应用程序。偶尔我会添加#if defined(_DEBUG)语句,以便在开发过程中帮助我。我的经理要求我删除所有这些陈述,因为他不想要两个版本的代码。我的感觉是,如果没有使用#if defined(_DEBUG)的能力,在开发过程中bug很可能不会被发现。
有没有人对此有任何想法?
答案 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)
使用生产代码编译调试代码有利有弊。
一些优点:
一些缺点:
特别是,如果使用编译出的代码(甚至是assert()调用),请务必小心调试代码没有副作用。否则,您将创建在打开调试时消失的错误。
通过使用体面的日志框架,您可以实现至少一些专业人员。例如,我使用rLog取得了一些成功 - 我喜欢它的一个原因是它被优化以最小化休眠日志记录语句的开销。其他更新的日志记录框架提供了类似的功能。
话虽如此,我使用的每个C ++环境至少都有一定程度的编译进/出调试代码。例如,assert()根据NDEBUG宏编译进/出。 ASSERT()/ _DEBUG似乎是该主题的MSVC特定变体(尽管据我所知,MSVC也支持更标准的assert()/ NDEBUG)。
答案 2 :(得分:1)
如果经理想要这个他不明白目标代码质量...... 如果删除#if,您也可以删除任何类型的ASSERT。因为他们只是隐藏#if _DEBUG。 请记住,MFC和CRT本身充满了这个(实际)有用的#if _DEBUG代码!
如果没有这些特殊的_DEBUG块,我将无法针对滥用类或捕获内部问题。