我正在编写一个基于MFC的C++应用程序。有时,我会添加#if defined(_DEBUG)语句,以便在开发过程中提供帮助。我的经理要求我删除所有这样的语句,因为他不想要两个版本的代码。我的感觉是,如果没有使用#if defined(_DEBUG)的能力,在开发过程中,bug更有可能悄悄进入而不被发现。
其他人对此有什么想法吗?
发布于 2013-12-05 13:38:29
运行库和MFC有两个版本,调试和发布,所以总是有两个版本的代码。
使用#ifdef(_DEBUG)和assert()将在调试过程中提供帮助。
但是..。
不建议在#ifdef子句中添加类/结构成员,因为对象的二进制接口将不同,如果从调试版本和发布版本序列化或发送此类结构,则它们将不同。
例如:
#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)与调试版本和发布版本不同。
发布于 2013-12-05 14:57:35
将调试代码从生产代码编译出来是有好处也有坏处的。
以下是一些优点:
调试产品可执行文件将不会浪费在准备从未使用过的日志消息、统计信息等方面。如果仅由
使用,则您可以删除对外部库的依赖关系
一些缺点:
使用两个不同的executables
version
特别是,如果使用编译出来的代码(甚至assert()调用),请非常小心,确保调试代码没有副作用。否则,您将创建bugs,这些bugs在打开调试时会消失。
您至少可以通过使用一个像样的日志记录框架来实现一些优点。例如,我在使用rLog时取得了一些成功--我喜欢它的一个原因是它经过优化,可以最大限度地减少休眠日志语句的开销。其他更新的日志框架也提供了类似的功能。
话虽如此,我工作过的每个C++环境都至少有一定程度的调试代码编译。例如,assert()根据NDEBUG宏编译入/出。ASSERT() / _DEBUG似乎是MSVC特定于该主题的变体(尽管据我所知,MSVC也支持更标准的assert() / NDEBUG)。
发布于 2013-12-05 15:01:29
如果经理想要这个他不理解的目标代码质量...如果应该删除#if,您还可以删除任何类型的断言。因为它们只是隐藏了#if _DEBUG。请记住,MFC和CRT本身充满了这个(真正的)有用的#if _DEBUG代码!
如果没有这种特殊的_DEBUG块,我就不能针对类的误用,或者捕获内部问题。
https://stackoverflow.com/questions/20392059
复制相似问题