08 2011 档案
摘要:第一步:开始->运行->regedit第二步:依次打开[HKEY_CURRENT_USER]\Software\Microsoft\VisualStudio\9.0\TextEditor 第三步:在右侧单击鼠标右键新建字符串值"Guides"(不包括双引号)第四步:选中刚才新建的字符串,单击右键修改,数值数据输入"RGB(255,0,0) 5, 80"(不包括双引号);其中"RGB(255,0,0) 5, 80"中"RGB(255,0,0)"的代表边界线颜色,"5"代表左边线离左边编
阅读全文
摘要:很多时候程序的 Debug 版本运行没有任何问题,但是一旦发布 Release 版本后,运行就出错,着实让人郁闷。大家知道,VC++ 中 Release 版本是对无法对源代码进行调试的。一般的做法是在怀疑有错误的代码前后插入MessageBox 函数,在函数中显示可能导致错误的变量的值。或者插入写文件的语句,输出可能导致错误的变量的值到一个记录文件。其实,除了上面讲的这个办法之外,还有其它的途径来调试 Release 版本的。下面就结合自己的经验和网上查找的一些资料给出调试 Release 版本的两个方法:方法一、利用 *.PDB 符号文件调试 Release 版本在 VCKBASE 的在线杂
阅读全文
摘要:1 案例描述作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭。请与您的供应商联系。呵呵,这句微软的“名言”,恐怕是程序员最怕见也最常见的东西了。在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩溃并不可怕,反而是测试的成功。作为开发的我们更需要关心的是程序中的哪个函数或哪一行导致了系统崩溃,这样才能有针对性的进行改正。本文描述了自己总结的几种定位崩溃的办法。2 案例分析以下是几种常见的崩溃现象及对应的处理办法:1. 对于Release版本必现的崩溃且在Debug版本上也崩溃的
阅读全文
摘要:编辑器加载中... C++提供了内联函数,目的是为了提高函数的执行效率。内联函数在函数声明前面加上关键字inline 就可以了 如:inline int FunctionOne(int x); 在VC++中可使用另一关键字_forceinline 代替inline 关键字.这个关键字将命令编译器跳过一般的ROI 分析(Return On Investment --一种编程缩略语),将所对应的代码强行内联.在有写时候,编译器会拒绝将一个函数内联,使用这个关键字,用户只得到一个编译警告,就可强行内联. 在使用内联函数时,是由编译器决定它们是按普通函数处理还是将调用函数部分用实际的函数体代码替换。不
阅读全文
摘要:1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。2 问题:extern 变量 在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a; 请问,这样可以吗? 答案与分析: 1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern c
阅读全文
摘要:要编译成DLL,就要声明和实现分开。首先文件组织是这样的(为了简化,没有加上编译成DLL的语句)在 T.h 中(声明模板函数)template<typename T>T Max(T& t1,T& t2);在 T.cpp 中(模板函数的实现)#include"T.h"template<typename T>T Max(T& t1,T& t2){ return t1>t2?t1:t2;}编译 T.cpp 很好,通过编译在 Main.cpp 中(用于测试的)#include<iostream>using n
阅读全文
摘要:一般我们在全局作用域定义全局变量来进行模块间(函数之间、类之间)的数据交互。可是在Lib里干这种事情得当心了,如果这个Lib被两个或两个以上的DLL(包括EXE)链接,并且他们都调用了Lib中同一个全局变量,那么灾难很可能发生了。因为对于DLL而言,链接Lib只是得到了Lib的一份拷贝,也就是说,每个DLL中得到的Lib的拷贝都是独立的,相互之间无联系的。因此,这个“同一个”全局变量,其实在每个DLL中都已经单独存在了,已经不是唯一的“同一个”,而是每个DLL各有一个。所以,这些DLL是不能通过Lib中的全局变量进行数据交互的,他们各不相干。
阅读全文
摘要:今天将VC2008中的解决方案转到VC6中进行编译,由于解决方案太大,采用IncrediBuild进行联合编译。在编译一个使用了预编译头的项目时,出现了多条类似如下错误:error C2858: command-line option 'program database name (/Fde:\Project\MY\中文\debug\gameclinet_ib_1.pdb)' inconsistent with precompiled header, which used '/Fde:\Project\MY\中文\debug\gameclinet.pdb' Ga
阅读全文
摘要:确定编译器分配的用于构造预编译头的内存量。/Zmfactor参数factor一个比例因子,确定编译器用于构造预编译头的内存量。 factor 参数是编译器定义的工作缓冲区的默认大小所占的百分比。 factor 参数的默认值是 100 (%),但您可以指定更大或更小的数量。备注在早期版本的 Visual C++ 中,编译器使用几个离散堆,每个堆都有一定的限制。 当前,编译器可根据需要动态增加堆,最多可增加到总堆大小限制,并且只需要固定大小的缓冲区即可构造预编译头。 因此,很少需要 /Zm 编译器选项。如果在您使用 /Zm 编译器选项时,编译器用完堆空间,发出 C1060 错误消息,则您可能保留了
阅读全文
摘要:参考:这个错误是微软设计错误,因此如果遇到这个错误,我们只能躲过这个链接错误。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。MS,C有两种C函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误。因此建议使用支持多线程的msvcrt.lib。需要注意的是,当使用其他的库的时候最容易产生这种错误,例如boost和wxWindow使用/MD来编译的,也就是使用支持多线程的C函数库。这时候如果自己的程序没有指明/MD的话,就会提示两种C函数冲
阅读全文
摘要:一、接口的定义 有时候,我们得提供一些接口给别人使用。接口的作用,就是提供一个与其他系统交互的方法。其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供给外部的接口来与你进行通信。根据c++的特点,我们可以采用纯虚函数的方式来实现。这样做的好处是能够实现封装和多态。现举一实例,供大家参考。(不想做过多说明,大家一看就应该能够明白)Class IPerson{public: IPerson() {}; virtual ~IPerson()=0 {}; //注意,最好定义此虚析构函数,够避免子类不能正常调用析构函数;如果定义为纯虚析构函数,则必须带定义体,因为子类隐含调用该析构函数。
阅读全文