自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

陈皓专栏 【空谷幽兰,心如皓月】

芝兰生于深谷,不以无人而不芳;君子修道立德,不为困穷而改节。

  • 博客(141)
  • 收藏
  • 关注

原创 Unix传奇 (上篇)

Unix传奇(上篇) 陈皓 了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 Unix是目前

2007-03-27 09:30:00 36372 16

原创 其实Unix很简单

其实Unix很简单 陈皓 很多编程的朋友都在网上问我这样的几个问题,Unix怎么学?Unix怎么这么难?如何才能学好?并且让我给他们一些学好Unix的经验。在绝大多数时候,我发现问这些问题的朋友都有两个特点:1)对Unix有畏难心理,对其没有信心;2)喜欢用拿Windows来和Unix做比较。 这两种特点就像两个“心理暗示”,暗示着自己Unix很不好学,暗示着Uni

2007-03-19 14:55:00 164352 134

原创 STL 的string类怎么啦?

 STL 的string类怎么啦?陈皓 前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对string类失去了信心和信任,他觉得他对string类一头雾水。老实说,我几年前也有同样的痛苦(就是当我写下《标准C++类string的Copy-O

2007-01-23 15:33:00 44386 24

原创 从语句 char* p="test" 说起

从语句 char* p="test" 说起 陈皓  我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧。               char* p = "test"; 同时,我也相信,各位在使用这种语句后吃过很多苦头也不少吧?只要你想利用指针p来改变字符串的内容,你的程序都会得到一个让你颜面尽失一个内存非法操作。比如,下面的这些语句: 

2006-11-19 03:29:00 28078 47

原创 C/C++返回内部静态成员的陷阱

  C/C++返回内部静态成员的陷阱陈皓背景在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。这是一个让无数人困扰的问题。如果你一不小心,你就很

2006-11-16 17:10:00 29869 29

原创 “抄袭事件”判决书

说明:判决书按所抄袭的书分成两个部分,由于比较长,所以,这里只是一些节选。关于《编程修养》一书的判决书:(2006)海民初字第13849号经审理确认如下事实:《编程修养》文系由陈皓创作完成,全文为37千字。陈皓于2003年5月将《编》文首次发表于其在网址为www.csdn.net的中国软件开发网所开设的个人专栏(网址为blog.csdn.net/haoel)中。清华出版社于2003年12月出版《软

2006-11-14 16:31:00 59954 95

原创 “抄袭事件”开庭小志

第一次开庭时间为——2006年10月18日早9点,于海淀区人民法院44号法庭。当天到庭的有我和我的代理律师刘铭,以及被告清华大学出版社和中关村图书大厦。新华书店总店缺席。法庭上, 清华大学出版社强词夺理,气焰还是那么一贯的嚣张。 清华大学出版社对于王立峰和李玉波给我的道歉信、CSDN开具的证明、李玉波没有和清华大学出版社签署合同的证明信,以及王立峰在出版过程中清华大学编辑

2006-10-13 09:39:00 10010 11

原创 抄袭事件进展日志

(最新更新:2006年10月24日)抄袭事件进展日志  2004年7月底,某网友从MSN上告诉我我的《编程修养》被一本叫《软件工程理论与实践》的书抄袭了。第二天我就购买了此书,发现抄袭地一字不差,文中还有我的名字出现。抄袭篇幅达本书的1/102004年8月初,在清华大学出版社主任章忆文的组织下,我和章忆文、书的作者王立峰、以及另外两位清华出版社的编辑讨论相关解决事宜。最后,由于清华大学

2006-05-25 14:50:00 17301 35

原创 抄袭事件民事起诉书

  民事起诉书 原告 陈皓 被告 第一被告:清华大学出版社 第二被告:新华书店总店 被三被告:

2006-05-16 17:03:00 22824 13

原创 “清华大学出版社抄袭事件”——章忆文给我的短信

今天,章忆文给我发来的短信——她对我说:“我觉得你是在污辱自己的人格”当我把“清华大学出版社抄袭事件”的整个过程发布了以后,一星期来,引起了清华大学出版社的编辑们强烈的反应(可以看看我的“清华大学出版社“抄袭事件”回放” 中的评论就知道他们在干什么了)。今天,我接到了章忆文的电话。她在电话里和我这样说: 她在电话里说,我在网上的文章根本属于造谣,侵害的她的名誉。(我文中的

2006-03-27 16:25:00 42027 223

原创 绝不妥协

  上周在BLOG上把“清华大学出版抄袭事件”来龙去脉说明了一下。看到了很多网友的评论和留言,各种观点的都有,在继续这篇文章之前,我把评论比较集中或是比较有代表性的几个贴子罗列以下,大家可以看看各种不同的评论和看法。 我在CSDN的BLOGhttp://blog.csdn.net/haoel/archive/2006/03/19/628927.aspx 水木社区http:/

2006-03-23 22:58:00 19427 41

原创 清华大学出版社“抄袭事件”回放

关于“抄袭事件”,首先,我想感谢大家对我的支持。这些天来,我一直都在和律师、作者、清华大学出版社进行沟通和交涉。现在,我想把这期间发生的事情写下来,让大家看看这一事情中的众生百态。 首先先说第一本书《软件工程理论与实践》,2004年8月,某网友(请原谅我忘记了这位网友)在MSN上告诉我“章华”抄袭了我的《编程修养》,于是我马上和清华大学出版社联系。当时清华大学出版社负责版权问题的是王听讲主

2006-03-19 11:56:00 65276 321

原创 抄袭的人是可耻的

前几天上网收信,看到网友发信给我说我的《跟我一起写Makefile》以及《用GDB调试程序》被抄袭了,已被出版。一看,还是清华大学出版社。唉,这是清华大学出版社出版的第二本抄袭我文章的书了,第一次是在两年前,我的《编程修养》被抄了,当然我还见了清华大学出版社的主编和书的第一作者(王立峰),我还记得当时我给他们提出的要求是:1)立即停止发行。2)作者和出版社给我书面道歉。3)在CSDN和清华大学出版

2006-03-16 13:37:00 30421 43

原创 标准C++类string的Copy-On-Write技术(三)

2.3.4、      Copy-On-Write的具体实现是怎么样的? 最后的这个问题,我们主要解决的是那个“民主集中”的难题。请先看下面的代码:  string h1 = “hello”; string h2= h1; string h3;

2004-06-23 16:15:00 16899 17

原创 标准C++类string的Copy-On-Write技术(二)

2.2、         深入在深入这前,通过上述的演示,我们应该知道在string类中,要实现写时才拷贝,需要解决两个问题,一个是内存共享,一个是Copy-On-Wirte,这两个主题会让我们产生许多疑问,还是让我们带着这样几个问题来学习吧:1、  Copy-On-Write的原理是什么?2、  string类在什么情况下才共享内存的?3、  string类在什么情况下触发写

2004-06-23 16:09:00 19968 2

原创 标准C++类string的Copy-On-Write技术(一)

标准C++类std::string的内存共享和Copy-On-Write技术 陈皓1、             概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书

2004-06-23 16:06:00 64506 15

原创 跟我一起写 Makefile(九)

使用函数————在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函数的返回值可以当做变量来使用。一、函数的调用语法函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:    $( )或是    ${ }这里,就是函数名,make支持的函数不多。是函数的

2004-02-25 10:16:00 65119 12

原创 跟我一起写 Makefile(十一)

make 的运行——————一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。一、make的退出码make命令执行后有三个退出码:    0 —

2004-02-25 10:16:00 32884 4

原创 跟我一起写 Makefile(十二)

 隐含规则————在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。“隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makef

2004-02-25 10:16:00 28403 6

原创 跟我一起写 Makefile(十三)

五、定义模式规则你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。有一点需要注意的是,"%"的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入Makefile时,而模式规则中的"%"则发生在运行时

2004-02-25 10:16:00 31090 10

原创 跟我一起写 Makefile(七)

使用变量————在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”,“命令”或是Makefile的其它部分中。变量的命名字可以包含字符、数字,下划线(可以是数字开头)

2004-02-25 10:15:00 35559 10

原创 跟我一起写 Makefile(八)

六、多行变量 还有一种设置变量值的方法是使用define关键字。使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过“命令包”的技术就是利用这个关键字)。define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef关键字结束。其工作方式和“=”操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头,所以如

2004-02-25 10:15:00 47246 9

原创 跟我一起写 Makefile(十)

四、foreach 函数 foreach函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:     $(foreach ,,) 这个函数的意思是,把参数中的单词逐一取出放到参数

2004-02-24 16:53:00 34700 10

原创 跟我一起写 Makefile(六)

书写命令————每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略,但是如果该空格或空行是以Tab键开头的,那么make会认为其是一个空命令。我们在UNIX下可能会使用不同的Shell,但是make的命令默认是被“/bin/sh”——

2004-02-24 16:51:00 62972 10

原创 跟我一起写 Makefile(四)

书写规则————规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会

2004-02-24 16:50:00 66011 24

原创 跟我一起写 Makefile(五)

六、多目标Makefile的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一个,这可能会可我们带来麻烦,不过好在我们的可以使用一个自动化变量“$@”(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。   

2004-02-24 16:50:00 77578 23

原创 跟我一起写 Makefile(二)

三、make是如何工作的在默认的方式下,也就是我们只输入make命令。那么,    1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。    2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。    3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文

2004-02-24 16:49:00 107921 30

原创 跟我一起写 Makefile(三)

Makefile 总述———————一、Makefile里有什么?Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书

2004-02-24 16:49:00 107483 24

原创 跟我一起写 Makefile(一)

跟我一起写 Makefile 陈皓概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自

2004-02-24 16:48:00 658956 264

原创 跟我一起写 Makefile(十四)

使用make更新函数库文件———————————函数库文件也就是对Object文件(程序编译的中间文件)的打包文件。在Unix下,一般是由命令"ar"来完成打包工作。一、函数库文件的成员一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:    archive(member)这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了"ar"命令

2004-02-24 16:36:00 34356 64

原创 以程序的方式操纵NTFS的文件权限(中)

还是请看例程,这个程序比较长,来源于MSDN,我做了一点点修改,并把自己的理解加在注释中,所以,请注意代码中的注释: #include #include #include //使用Windows的HeapAlloc函数进行动态内存分配#define myheapalloc(x)

2004-01-25 21:18:00 6392

原创 以程序的方式操纵NTFS的文件权限(上)

以程序的方式操纵NTFS的文件权限陈皓 Windows NT/2K/XP版本的操作系统都支持NTFS格式的文件系统,这是一个有安全性质的文件系统,你可以通过Windows的资源管理器来设置对每个目录和文件的用户访问权限。这里我就不对NTFS的安全性进行讲述了,我默认你对NTFS的文件目录的安全设置有了一定的了解。在这里,我将向你介绍使用Windows的API函数来操纵NTFS的文件权限

2004-01-25 21:17:00 20876 2

原创 以程序的方式操纵NTFS的文件权限(下)

    //     // STEP 14: 把一个 access-allowed 的ACE 加入到新的DACL中    //     前面的循环拷贝了所有的非继承且SID为其它用户的ACE,退出循环的第一件事    // 就是加入我们指定的ACE。请注意首先先动态装载了一个AddAccessAllowed

2004-01-20 21:19:00 7869 7

原创 C/C++内存问题检查利器—Purify (五)

十、             设置WatchPoint你可以在你的程序中,对你所想监控的程序设置一些WatchPoint,以方便于你对程序进行调试,或更容易找出问题的原因。就像我前面说,Purify可以找到你的内存泄露,但其不能找到内存泄露的原因,你可以通过设置WatchPoint来跟踪一块内存,以找到在程序执行过程中该内存的访问情况。 Purify的WatchPoint可以产生下例消

2003-12-16 13:01:00 10507 1

原创 C/C++内存问题检查利器—Purify (四)

 七、             Purify的退出码像UNIX下的软件,一般都会提供和别的应用程序的接口,像上面的生成文本文件,也是给别的应用程序提供接口的一种方式。这里,我们所要讲述的是Purify的退出码,我们知道程序都有退出码,以提供给别的程序或操作系统自己运行的信息。被Purify编译过的程序,你可以通过指定-exit-status参数来告诉Purify是否用Purify的退出码,

2003-12-16 12:58:00 8651

原创 C/C++内存问题检查利器—Purify (三)

五、             文件描述符问题在上面的内存问题表中,对于大多数的内存问题来说,相信对于熟悉C/C++的程序员,并不陌生。有一些关于Watchpoint和文件描述符的内容,可能会让你看得比较模糊,对于Watchpoint,我会在后面讲述。这一节,我就一个示例说一说文件描述述问题是如何产生的,并由此介绍一下Purify的一些特性。 先查看下面这段程序: 

2003-12-15 01:26:00 22997 2

原创 C/C++内存问题检查利器—Purify (二)

 三、           示例假设我们现在有这样一段程序:hello.c #include #include   static char *helloWorld = "Hello, World";

2003-12-11 11:37:00 15233 2

原创 C/C++内存问题检查利器—Purify (一)

C/C++内存问题检查利器——Purify 陈皓一、           引言 我们都知道软件的测试(在以产品为主的软件公司中叫做QA—Quality Assessment)占了整个软件工程的30% -50%,但有这么一种说法,即使是最优秀测试专家设计出来的测试案例,也无法彻底地检测到内存上的问题。     使用C/C++开发的团队一定有被其内存问题折磨过的

2003-12-11 11:34:00 42286 10

原创 用GDB调试程序(三)

四、维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。    clear        清除所有的已定义的停止点。    clear     clear         清除所有设置在函数上的停止点。    clear    

2003-07-21 18:36:00 44906 10

原创 用GDB调试程序(六)

 七、设置显示选项    GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。    set print address     set print address on         打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,如:                (gdb) f        #0  set_quotes (lq=0x3

2003-07-12 22:24:00 44016 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除