博文

VC Studio 使用技巧大全(2007-01-26 12:36:00)

摘要:VC Studio 使用技巧大全 1.检测程序中的括号是否匹配
把光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告声。
2.查看一个宏(或变量、函数)的宏定义
把光标移动到你想知道的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的Go To Defition Of …),如果没有建立Browse files,会出现提示对话框,确定,然后就会跳到定义那些东西的地方。
3.格式化一段乱七八糟的源代码
选中那段源代码,按ATL+F8。
4.在编辑状态下发现成员变量或函数不能显示
删除该项目扩展名为.ncb文件,重新打开该项目。
5.如何整理ClassView视图中大量的类
可以在classview 视图中右键新建文件夹(new folder),再把具有相近性质的类拖到对应的文件夹中,使整个视图看上去清晰明了
. 6.定位预处理指定
在源文件中定位光标到对称的#if, #endif,使用Ctrl+K.
7.如何添加系统中Lib到当前项目
在Project | Settings | Link | Object/library modules:输入Lib名称,不同的Lib之间用空格格开.
8.如何添加系统中的头文件(.h)到当前项目.
#include <FileName.h>,告诉编译到VC系统目录去找;使用#include "FileName.h",告诉编译在当前目录找.
9.如何在Studio使用汇编调试
在WorkBench的Debugger状态下按CTRL+F7.
10.怎样处理ClassZiard找不到的系统消息
如果要在ClassWizard中处理WM_NCHITTEST等系统消息,请在ClassWizard中Class Info页中将Message filter改为Window就有了.
11.如何干净的删除一个类
先从Workspace中的F......

阅读全文(3958) | 评论:0

深入理解C语言指针的奥秘 来自csdn论坛(2007-01-14 00:46:00)

摘要:深入理解C语言指针的奥秘 来自csdn论坛 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
  先声明几个指针放着做例子:
  例一:
  (1)int*ptr;
  (2)char*ptr;
  (3)int**ptr;
  (4)int(*ptr)[3];
  (5)int*(*ptr)[4];
  
  指针的类型
  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
  (1)int*ptr;//指针的类型是int*
  (2)char*ptr;//指针的类型是char*
  (3)int**ptr;//指针的类型是int**
  (4)int(*ptr)[3];//指针的类型是int(*)[3]
  (5)int*(*ptr)[4];//指针的类型是int*(*)[4]
  怎么样?找出指针的类型的方法是不是很简单?
  指针所指向的类型
  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
  (1)int*ptr;//指针所指向的类型是int
  (2)char*ptr;//指针所指向的的类型是char
  (3)int**ptr;//指针所指向的的类型是int*
  (4)int(*ptr)[3];//指针所指向的的类型是int()[3]
  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
  在指针的算术运算中,指针所指向的类型有很大的作用。
  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类......

阅读全文(3044) | 评论:1

【Scott Meyers】C++5×5断想之三:C++历史上最重要的软件 (2007-01-14 00:21:00)

摘要:【Scott Meyers】C++5×5断想之三:C++历史上最重要的软件 原文地址:http://www.artima.com/cppsource/top_cpp_software.html。译文发表于《程序员》2007.1。  作者介绍 Scott Meyers,C++顶级权威之一,为世界各地客户提供培训和咨询服务。出版有畅销的Effective C++系列图书(《Effective C++》、《More Effective C++》和《Effective STL》),设计了创新型的Effective C++ CD,Addison Wesley的Effective Software Development Series顾问编辑,The C++ Source (http://www.artima.com/cppsource/)咨询板块专家。布朗大学计算机科学博士,他的网站是www.aristeia.com。     在本系列的第三篇文章里,我将把视线转移到评选过去最重要的C++软件上来。 用C++编写软件,你需要工具的帮助。在我看来,这些工具曾经是(将来也是)有关C++的最重要软件。可以想见,曾经出现了不少用C++开发的重磅软件,它们促使很多人为了以后项目的开发选择了这门语言,但我不关心这些。这门语言最重要的软件应该是软件开发人群使用的最基本的东西:编译器和库。可能,C++是更为库编写而不是应用开发所设计的一门语言。 我选择的C++历史上最重要的五个软件如下,以诞生年份为序: Cfront,AT&T的Bell实验室开发,1985-1993。Cfront是最早的C++编译器。它可是真正的编译器,不过生成的是C格式的目标码。因此将它认作C++到C代码的预处理器是很自然的。很难让人在调试时不做它想,因为至少在我1998年开始使用它时,仍然没有C++调试器。头发花白的前辈们当时使用C调试器,必须要对付那些让人精神崩溃的名字(比如,识别调试器里指向C++源代码中某个加法函数的__pl__1Aff)。 事实上,Cfront生成C目标码有两个好处。第一,可以非常容易将Cfront移植到新的平台,因为C编译器到处都是。这就促成了C++在各种环境里的快速传播。第二,使用者可以观察编译生成的代码,知道编译所做的工......

阅读全文(3708) | 评论:0

C语言测试:想成为嵌入式程序员应知道的0x10个基本问题 (2007-01-04 12:15:00)

摘要:C语言测试:想成为嵌入式程序员应知道的0x10个基本问题 C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。  从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。  从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。  有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。  这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。
预处理器(Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
 
 我在这想看到几件事情: ; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
; 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长......

阅读全文(3453) | 评论:0

C++各大有名库的介绍 来自csdn(2006-12-20 20:11:00)

摘要:C++各大有名库的介绍 来自csdn   来自csdn  http://blog.csdn.net/wqf363/archive/2006/11/22/1406251.aspx 在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过 设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重量级 的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者 水平,其中很多并不了解。所以文中所提的一些库都是比较著名的大型库。 标准库 标准库中提供了C++程序的基本设施。虽然C++标准库随着C++标准折腾了许多年,直到标准的出台才正 式定型,但是在标准库的实现上却很令人欣慰得看到多种实现,并且已被实践证明为有工业级别强度的 佳作。 1、   Dinkumware C++ Library 参考站点:http://www.dinkumware.com/'>http://www.dinkumware.com/ P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编 写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C++的产品中采用 Dinkumware的库。 2、   RogueWave Standard C++ Library 参考站点: http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/'>http://ww w.roguewave.com/ 这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用 。 3、SGI STL 参考站点: http://www.roguewave.com/'>http://www.roguewave.com/'>http://www.roguewave.com/'>http://ww w.rog......

阅读全文(5513) | 评论:0

61条面向对象设计的经验原则 来自csdn论坛(2006-12-14 19:46:00)

摘要:61条面向对象设计的经验原则 来自csdn论坛 “你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。”
----------Arthur J.Riel (1)所有数据都应该隐藏在所在的类的内部。 (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。 (3)尽量减少类的协议中的消息。 (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 (5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。
如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。 (6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。 (7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。 (8)类应该只表示一个关键抽象。
包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响 . (9)把相关的数据和行为集中放置。
设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 (10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。
朝着稳定的方向进行依赖. (11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。 (12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。 (13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。
规划一个接口而不是实现一个接口。 (14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。 (15)对包含太多互不沟通的行为的类多加小心。
这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。 (16)在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。 (17)尽可能地按......

阅读全文(2818) | 评论:0

内存池(MemPool)技术详解 转(2006-11-24 21:45:00)

摘要:内存池(MemPool)技术详解 转 转载声明:本文转自csdn博客,许式伟著,链接:http://blog.csdn.net/xushiweizh/archive/2006/11/22/1402967.aspx  小狼注:上次也写了一个简单的内存池,是使用STL的deque来管理的,实现起来比较简单,不过有个缺点就是只能固定分配大小,所以需要根据经验值事先分配内存大小,然后把内存再次划分为等大的小的内存供使用。 概述 内存池(MemPool)技术备受推崇。我用google搜索了下,没有找到比较详细的原理性的文章,故此补充一个。另外,补充了boost::pool组件与经典MemPool的差异。同时也描述了MemPool在sgi-stl/stlport中的运用。   经典的内存池技术   经典的内存池(MemPool)技术,是一种用于分配大量大小相同的小对象的技术。通过该技术可以极大加快内存分配/释放过程。下面我们详细解释其中的奥妙。   经典的内存池只涉及两个常量:MemBlockSize、ItemSize(小对象的大小,但不能小于指针的大小,在32位平台也就是不能小于4字节),以及两个指针变量MemBlockHeader、FreeNodeHeader。开始,这两个指针均为空。   class MemPool
{
private:
    const int m_nMemBlockSize;
    const int m_nItemSize;

    struct _FreeNode {
        _FreeNode* pPrev;         BYTE data[m_nItemSize - sizeof(_FreeNode*)];
  &n......

阅读全文(6665) | 评论:1

从语句 char* p="test" 说起 -陈皓著(2006-11-24 21:19:00)

摘要:从语句 char* p="test" 说起 -陈皓著 小狼:再看到这篇文章之前,曾经有人问我char* p="hello!"和char p[]="Hello!"的区别;最近有个同时在测试代码里面写了类似:char* p="hello!",我还开玩笑的说:别说是我看着他写的。呵呵,当时就觉得有必要写下这个用法,没想到有人总结了这么详细的文章,推荐一下! 我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧。                 char* p = "test";   同时,我也相信,各位在使用这种语句后吃过很多苦头也不少吧?只要你想利用指针p来改变字符串的内容,你的程序都会得到一个让你颜面尽失一个内存非法操作。比如,下面的这些语句:                 p[0] = 's';               strcpy(p, "haoel");   原因就在于,char* p = "test"; 这个声明,声明了一个指针,而这个指针指向的是全局的const内存区,const内存区当然不会让你想改就改的。所以,如果你一定要写这块内存的话,那就是一个非常严重的内存错误。另,之所以加粗“全局const内存区”,是强调一下,如果你不信的话,你可以试试下面这段代码,看看p1和p2的地址是不是一样的。                 char* p1 = "anything";               char* p2 = "......

阅读全文(3938) | 评论:0

在不引用第3参数的条件下将 a,b的值互换(2006-11-16 19:36:00)

摘要:有两个参数 a=10 , b=15;
在不引用第3参数的条件下将 a,b的值互换

不考虑溢出有如下方法:
(1)
a = a + b; //a=25,b=15
b = a - b; //a=25,b=10
a = a - b; //a=15,b=10
同样:
b = b - a; //a=10 b=10
a = a + b; //a=20 b=10
b = 2 * b; //a=20 b=20

(2)
b=a-(a=b)*0
或者
b=a+(a=b)*0
或者
a=b+(b=a)*0;

(3)
a=a*b;
b=a/b;
a=a/b; 考虑溢出有如下方法:
(4)
a=a^b;
b=a^b;
a=a^b;
精简点的:
a^=b^(b^=a^b);
或者
a^=b^=a^=b;

(5)
还有汇编利用堆栈的:
push a
push b
pop b
pop a
......

阅读全文(3424) | 评论:0

【转】用Gmail和Firefox架设个人FTP(2006-04-19 12:55:00)

摘要: 用Gmail和Firefox架设个人FTP

安安:转自赵同学blog,特表感谢! FTP很有用,但是如果没有专门的服务器,用个人电脑做FTP服务器,不但占用空间,还影响性能。现在不用为这个烦恼了,如果你在同时使用Gmail和Firefox,那么就可以实现一个FTP,是不是很好玩啊? Gmail,虽然现在还需要邀请才能注册,但也不是什么稀罕装备了,寻个邀请很容易。而且它的容量在一直增长,现在已经达到了2714M,如果只用来存储邮件,有点浪费容量了。 Firefox,也挺好的,在浏览器市场所占的份额已经超过了10%,占用资源少,启动迅速,丝毫不比IE逊色。 现在就把现学来的现卖,介绍一下步骤: 首先要安装Firefox浏览器,在mozilla主页http://www.mozilla.com/firefox/下载,速度飕飕的; 最好另外注册一个Gmail帐号,用来做FTP服务器,因为据说一天流量超过2G,帐号会被Google暂时冻结; 现在万事俱备,只欠东风了,下载一个Firefox浏览器的插件就好了,到这儿http://www.rjonna.com/ext/gspace.php下载了这个名称为Gmail File Space的插件,它的格式为xpi,不是可执行文件不能直接安装; 添加这个插件的方法:打开Firefox,依次点击文件>打开文件,然后选中这个插件,点击打开,关闭所有的Firefox页面。再次打开后,在工具的下拉菜单里面就多了一个GSpace的选项,点击后就会出现一个类似于FlashFXP的界面,FTP架设成功了;填入自己Gmail帐号和密码这个FTP就可以使用了。 暂时上传文件的限制好像是要小于15M,也不能上传exe和dll等格式的文件,没试。 不过用这个FTP放点课间或MP3的还是很不错的。  ......

阅读全文(5018) | 评论:0