再问关于release版和debug版的区别

hitirlab 2005-01-31 01:22:16
这个问题我都问了好几次了,始终没有人能给我满意的答复
谁能给我解释清楚一些啊,我分都给他

PosTagging.h
#include"StdAfx.h"//这行有的话debug好使,没有的话debug不好使,而无论有没有release都好使
class CPosTag
{
public:
private:
map<string, int> wordMap;
};
-----------------
PosTagging.cpp
#include "StdAfx.h"
#include "PosTagging.h"
.......

上面这段代码到底是怎么回事,我都郁闷好长时间了
...全文
183 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitirlab 2005-01-31
  • 打赏
  • 举报
回复
不可能啊,我编译选项从来没动过
mykreny 2005-01-31
  • 打赏
  • 举报
回复
不是debug或者release版本的问题,问题在于你是否在你的工程属性中选择使用“编译头”的问题,从你的描述中看你在debug中用了,而在release中没有用,因此出现这种情况!至于编译头的使用,只是一个优化,对于提高编译速度有帮助,至于其他的功用,楼上有人讲了!!
hitirlab 2005-01-31
  • 打赏
  • 举报
回复
PosTagging.cpp
#include "StdAfx.h"//如果这两行调换一下的话,
#include "PosTagging.h"//你就会发现Debug和Release就可能都不好使了。
.......
我试了,好使啊
hitirlab 2005-01-31
  • 打赏
  • 举报
回复
那为什么#include"StdAfx.h"//这行有的话debug好使,没有的话debug不好使,而无论有没有release都好使呢?
naturemickey 2005-01-31
  • 打赏
  • 举报
回复
PosTagging.h
//#include"StdAfx.h"//这行有的话debug好使,没有的话debug不好使,而无论有没有release都好使
class CPosTag
{
public:
private:
map<string, int> wordMap;
};
-----------------
PosTagging.cpp
#include "StdAfx.h"//如果这两行调换一下的话,
#include "PosTagging.h"//你就会发现Debug和Release就可能都不好使了。
.......

在《大规模C++程序设计》中有一个设计规则:
每个组件的.c文件都应该将包含它自己的.h文件的语句作为其代码的第一行有效的语句。
-------------------------------------
把包含.h文件的语句作为.c文件的第一行,可以确保组件物理接口的固有信息之关键段不会从.h文件中遗漏(或者,如果有的话,在你试图编译.c文件时会马上发现它)。
考虑下面组件wildthing的头文件:
// wildthing.h
#ifndef INCLUDE_WILDTHING
#define INCLUDE_WILDTHING

class WildThing{
//...
public:
WildThing( );
//...
};
ostream& operator<<(constostream& o,const WildThing& thing);
//Note: uses class ostream in the interface

#endif
注意,我们已经重载了左移运算符(<<),所采用的方法对于数据流输出是正常的,也是惯例。下央考虑实现:
//wildthing.c
#include<iostream.h>
#include"wildthing.h"
//...
ostream& operator<<(constostream& o,const WildThing& thing){
//...
}
我们尝试编译这个实现,它编译得很好。下一步我们为wildthing创建一个测试文件:
//wildthing.t.c
#include<iostream.h>
#include"wildthing.h"

int main()
{
WildThing wild;
//...
cout << wild << endl;

return 0;
}
文件wildthing.t.c编译和连接了。程序运行得很好,然后我们去告诉所有朋友我们完成了。但是,这里央有一个错误并且是一个物理错误!下面的程序不能通过编译,为什么?
//product.c
#include"wildthing.h"
#include<iostream.h>

int main()
{
WildThing wild;
//...
cout << wild << endl;
return 0;
}
问题出在我们试图在operator<<(在wildthing.h中声明的)的接口中使用类ostream时没有事先声明它。客户代码中#include指令的顺序颠倒了,现在头文件自身不能进行语法分析,因为ostream标识符还没有声明。我们怎样处理这个问题呢?
一量找出了错误,修正就很简单:在第一次使用ostream之前将声明"class ostream"加入wildthing.h的文件作用域:
//wildthing.h
#ifndef INCLUDE_WILDTHING
#defing INCLUDE_WILDTHING

class ostream; // was missing before. oops!

class WildThing{
//...
public:
WildThing( );
//...
};
ostream& operator<<(const ostream& o, const WildThing& thing);

#endif
更重要的问题是我们怎样预防此类问题?答案同样简单。始终让每个组件的.c文件在包含或声明任何别的东西之前包含该组件的.h文件。通过这种方法,每个组件都能确保它自己的头文件对于编译来说都是能自我满足的。
建议你读一下这本书,仅看上面的程序,你就会发现它与一般人的习惯不同,比如:operator<<函数没有作为class WildThing的友元。这其中也有好多说法。读了这本书后,你会发现,自己从前的很多习惯在大规模程序设计时会成为致命的错误。
qrlvls 2005-01-31
  • 打赏
  • 举报
回复
这是为了避免重复定义而考虑
qrlvls 2005-01-31
  • 打赏
  • 举报
回复
#include "stdafx.h"
通道加在 .cpp 文件中,而非 .h 中
qrlvls 2005-01-31
  • 打赏
  • 举报
回复
描述上有些问题
查看MFC的源码会看到很多
#ifdef _UNICODE
...
#endif
Debug实现了可调试的功能,为集成环境的调度提供了可能
而Release版本中这些内容不会被编译,但不能进行细节的调试
因此Release版本生成的目标文件比Debug版本更小

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧