1、测绘生产质量管理规定完全版测绘生产质量管理规定完全版测绘生产质量管理规定国家测绘局1997年7月发布第一章总则第一条为了提高测绘生产质量管理水平,确保测绘产品质量,依据中华人民共和国测绘法及有关法规,制定本规定。第二条测绘生产质量管理是指测绘单位从承接测绘任务、组织准备、技术设计、生产作业直至产品交付使用全过程实施的质量管理。第三条测绘生产质量管理贯彻“质量第一、注重实效”的方针,以保证质量为中心,满足需求为目标,防检结合为手段,全员参与为基础,促进测绘单位走质量效益型的发展道路。第四条测绘单位必须经常进行质量教育,开展群众性的质量管理活动,不断增强干部职工的质量意识,有计划、分层次地组织岗位
2、技术培训,逐步实行持证上岗。第五条测绘单位必须健全质量管理的规章制度。甲级、乙级测绘资格单位应当设立质量管理或质量检查机构;丙级、丁级测绘资格单位应当设立专职质量管理或质量检查人员。第六条测绘单位应当按照国家的质量管理和质量保证标准,推行全面质量管理,建立和完善测绘质量体系,并可自愿申请通过质量体系认证。第二章测绘质量责任制第七条测绘单位必须建立以质量为中心的技术经济责任制,明确各部门、各岗位的职责及相互关系,规定考核办法,以作业质量、工作质量确保测绘产品质量。第八条测绘单位的法定代表人确定本单位的质量方针和质量目标,签发质量手册;建立本单位的质量体系并保证其有效运行;对提供的测绘产品承担产品
3、质量责任。第九条测绘单位的质量主管负责人按照职责分工负责质量方针、质量目标的贯彻实施,签发有关的质量文件及作业指导书;组织编制测绘项目的技术设计书,并对设计质量负责;处理生产过程中的重大技术问题和质量争议;审核技术总结;审定测绘产品的交付验收。第十条测绘单位的质量管理、质量检查机构及质量检查人员,在规定的职权范围内,负责质量管理的日常工作。编制年度质量计划,贯彻技术标准及质量文件;对作业过程进行现场监督和检查,处理质量问题;组织实施内部质量审核工作。各级质量检查人员对其所检查的产品质量负责,并有权予以质量否决,有权越级反映质量问题。第十一条生产岗位的作业人员必须严格执行操作规程,按照技术设计进
4、行作业,并对作业成果质量负责。其他岗位的工作人员,应当严格执行有关的规章制度,保证本岗位的工作质量。因工作质量问题影响产品质量的,承担相应的质量责任。第十二条测绘单位可以按照测绘项目的实际情况实行项目质量负责人制度。项目质量负责人对该测绘项目的产品质量负直接责任。第三章生产组织准备的质量管理第十三条测绘单位承接测绘任务时,应当逐步实行合同评审(或计划任务评审),保证具有满足任务要求的实施能力,并将该项任务纳入质量管理网络。合同评审结果作为技术设计的一项重要依据。第十四条测绘任务的实施,应坚持先设计后生产,不允许边设计边生产,禁止没有设计进行生产。技术设计书应按测绘主管部门的有关规定经过审核批准
5、,方可付诸执行。市场测绘任务根据具体情况编制技术设计书或测绘任务书,作为测绘合同的附件。第十五条测绘任务实施前,应组织有关人员的技术培训,学习技术设计书及有关的技术标准、操作规程。第十六条测绘任务实施前,应对需用的仪器、设备、工具进行检验和校正;在生产中应用的计算机软件及需用的各种物资,应能保证满足产品质量的要求,不合格的不准投入使用。第四章生产作业过程的质量管理第十七条重大测绘项目应实施首件产品的质量检验,对技术设计进行验证。首件产品质量检验点的设置,由测绘单位根据实际需要自行确定。第十八条测绘单位必须制定完整可行的工序管理流程表,加强工序管理的各项基础工作,有效控制影响产品质量的各种因素。
6、第十九条生产作业中的工序产品必须达到规定的质量要求,经作业人员自查、互检,如实填写质量记录,达到合格标准后,方可转入下工序。下工序有权退回不符合质量要求的上工序产品,上工序应及时进行修正、处理。退回及修正的过程,都必须如实填写质量记录。因质量问题造成下工序损失,或因错误判断造成上工序损失的,均应承担相应的经济责任。第二十条测绘单位应当在关键工序、重点工序设置必要的检验点,实施工序产品质量的现场检查。现场检验点的设置,可以根据测绘任务的性质、作业人员水平、降低质量成本等因素,由测绘单位自行确定。第二十一条对检查发现的不合格品,应及时进行跟踪处理,作出质量记录,采取纠正措施。不合格品经返工修正后,
7、应重新进行质量检查;不能进行返工修正的,应予报废并履行审批手续。第二十二条测绘单位必须建立内部质量审核制度。经成果质量过程检查的测绘产品,必须通过质量检查机构的最终检查,评定质量等级,编写最终检查报告。过程检查、最终检查和质量评定,按测绘产品检查验收规定和测绘产品质量评定标准执行。第五章产品使用过程的质量管理第二十三条测绘单位所交付的测绘产品,必须保证是合格品。第二十四条测绘单位应当建立质量信息反馈网络,主动征求用户对测绘质量的意见,并为用户提供咨询服务。第二十五条测绘单位应当及时、认真地处理用户的质量查询和反馈意见。与用户发生质量争议时,按照测绘质量监督管理办法的有关规定处理。第六章质量奖惩
8、第二十六条测绘单位应当建立质量奖惩制度。对在质量管理和提高产品质量中作出显著成绩的基层单位和个人,应给予奖励,并可申报参加测绘主管部门组织的质量评优活动。第二十七条对违章作业,粗制滥造甚至伪造成果的有关责任人;对不负责任,漏检错检甚至弄虚作假、徇私舞弊的质量管理、质量检查人员,依照测绘质量监督管理办法的相应条款进行处理。测绘单位对有关责任人员还可给予内部通报批评、行政处分及经济处罚。第七章附则第二十八条本规定由国家测绘局负责解释。第二十九条本规定自发布之日起施行。1988年3月国家测绘局发布的测绘生产质量管理规定(试行)同时废止。VisualC+201*入门教程写在前面在我还在上学的时候,我选
9、择了C+,最初我用VC6作为我的IDE,我看过很多本C+的教材,有的适合我,有的不适合我,其中有一本叫VisualC+201*入门经典的书帮了我不少的忙。因为通常的C+教材都只会介绍C+的语法什么的,很少会告诉我们如何去编译、运行,告诉我们什么是控制台程序,什么事Win程序,什么是GUI程序,C+能干什么,VC和C+的区别是什么。现在有很多的朋友应该也有这些问题吧?学C+用C+也有几年了,算不上熟悉,算是初窥门径吧,我想我应该做点什么帮助一下那些和曾经的我一样困惑的朋友,特别是学生朋友,告诉他们他们所困惑的问题的答案。记得我学C+的时候,没有人教,有的时候也走了不少弯路,甚至连调试也不会,也不
10、知道可以通过看调用堆栈看调用次序,还自己慢慢的去搜索,好傻啊。接下来我会做一个VisualC+201*入门教程系列,用来帮助初学者。刚开始学的时候是很痛苦的,这个我深有体会,特别是身边还没有人能够指导一二的。内容主要涵盖在Windows下面使用C+进行开发的常见内容,VisualStudio201*的使用,如何创建新项目,如何调试,如果配置项目属性等等,另外还会介绍VisualC+201*中新加如的一些内容,包括一些新的STL组建,一些新的语法支持等等。由于本人水平有限,其中难免有错误,希望大家谅解,如果大家有发现问题还请务必及时指出来,否则误导了他人我就罪不容恕了。注意,本教程非C+教程,不
11、会教你C+,只会教你如何使用VisualC+201*去练习去学习其它C+教材上面的程序。因此建议大家认真的去看其他的C+教程,在使用VisualC+201*实践的时候如果遇到问题可以到这里来参考。推荐C+Primer、C+程序设计语言VisualC+201*入门经典。第一章:关于VisualStudio、VC和C+的那些事首先,这三个东西有什么区别呢?VC和C+是相同的吗,有什么区别呢?我刚开始学C+的时候也有这样的问题,在这里我来替大家解释一下他们到底是什么。VisualStudio,我们一般都简称为VS,VC全称是VisualC+,C+就不用解释了吧?VisualStudio其实是微软开发
12、的一套工具集,它由各种各样的工具组成,这就好像Office201*是由Word201*、Excel201*、Access201*等等组成的一个道理。其中VisualC+就是VisualStudio的一个重要的组成部分。VisualStudio可以用于生成Web应用程序,也可以生成桌面应用程序,在VisualStudio下面,除了VC,还有VisualC#,VisualBasic,过去还有VisualJ#,现在还有VisualF#等等组件工具,使用这些工具你可以使用C+语言、C#语言或者Basic语言(微软改进版)进行开发。这就好比桌上放着刀、叉、筷子,你可以用它们来吃饭,无论你用什么工具都可以
13、,因为它们都是餐具的一种。VC,全称是VisualC+,它只是一个工具而已。C+是一门和C、Basic、C#、Java一个概念的东西,它是一门语言,这个概念就同汉语、英语、法语之间的关系一样。语言的可以不同,他们有的复杂有的精简,比如汉语,我个人认为这是这个星球上最复杂的语言;又比如电影阿凡达中外星人使用的语言,不过100都个单词而已。当然,语言并没有高低贵贱之分,而对语言掌握的好不好,说的好不好是有高下之别的。一个语言都有哪些要素呢?语法就是其中一个重要的方面,比如你要对你所喜欢的人表达爱慕之情,那么你应该说“我爱你”,你不能说“你爱我”,因为这搞错了主谓宾关系,因此我们通常都需要按照一定的
14、规矩和原则表达才会让别人正确理解我们真正的含义。在我们的汉语中有一些成语,它们通常都比较简单短小,但是却能表达非常强烈的感情,而且效果非常好。比如你想骂一个坏人“你实在是太变态了,这种事情都干得出来。”你可以这样说:“你也太禽兽不如了!”对于编程的语言来说,其实也是有成语的,在我看来,这就是库函数。通常我们在编程的时候都推荐选择库函数,因为它通常会比较快一些。一直以来都有不少人混淆VisualC+和VisualStudio,其实最初VisualC+发布的时候还没有VisualStudio这个东西,VisualC+是一个独立的开发工具,与VisualBasic等并列,最后微软将它们整合在一起组成
15、了VisualStudio。VisualC+从发布起到现在已经有10个大版本了,我们这里介绍的VisualC+201*就是VisualC+10,简称VC10。上朔10多年,VisualC+6.0发布了,这个被称为史上最经典的VC,现在有很多企业还在用它,大量的教材基于这个版本的VC来写的。然而实际上VC6并没有想象中的那么美好,孱弱的IDE,不完善的STL等等让它越来越不适应时代的发展,同时由于后来的版本和它的差别越来越大,让很多习惯于VC6教材的人在新版本上无所适从。VC6走向历史的终结点其实是必然的,只在于时间问题罢了,况且大部分人都有追求最新的“嗜好”,所以这里也选择最新版的VC来做入门
16、教程。下面来介绍下这个VC版本和VS版本的对应关系:VisualS(201*)-VisualC+.net(201*)-VisualC+7.0-_MSC_VER值1300这个是微软推出.net战略之后的最早的一个版本的VC,这个版本相对VC6来说变化并不是很大,一些不标准的语法依然得到支持,不过IDE界面已经出现了VS时代的雏形。VisualS201*-VisualC+.net201*-VisualC+7.1-_MSC_VER值1310这个版本我觉得只能算是一个对.net201*的一个Patch版本,解决了一些Bug,不规范的语法依然得到支持,比如for循环变量作用域的问题。VisualStud
17、io201*-VisualC+201*-VisualC+8.0-_MSC_VER1400这个版本算是一个比较符合C+标准的VC版本了,微软为这个版本的VC加入了大量的增强版的C库函数(CRT函数),如strcpy_s之类,当然,这部分并不是C和C+标准所要求的。VisualStudio201*-VisualC+201*-VisualC+9.0-_MSC_VER1500这个版本应该是在Vista发布之后出的,如果你是在Vista或者Win7下面使用,那么应该选择这个版本。这个版本与VC201*变化并不大,不过它的SP1为C+带来一些新的STL库组件(tr1部分),以及MFC下面的Ribbon界面
18、。VisualStudio201*-VisualC+201*-VisualC+10.0-_MSC_VER值1600.这个就是我们即将要介绍的版本,那么让我们来看一下它的启动画面吧。这个是VisualStudio201*中文旗舰版的启动画面。下一章中,我将教大家安装、配置VS201*/VC201*,以及如何使用它来创建第一个C+程序。如果你没有下载过VisualStudio201*的话,那么请你提前下载好它吧:%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/bb0975dd801291d58c1029f5.html第二章安装、配置和首次使用VS201*本章将帮助大家安装Vi
19、sualC+201*,帮助大家做一些常见的配置,以及第一次使用它来写HelloWord程序。安装VisualC+201*是属于VisualStudio201*的一部分,这个在前一章中已经讲解过,实际上VisualC+201*也有更多的子版本,正如Windows7有旗舰版、家庭高级版、家庭初级版一样。在上一章的下载地址中有两个版本可以选择,我选择的时候旗舰版,这个功能最全面。如果你下载完毕了,应该有一个ISO镜像文件,如果你是从我给的地址下载的,那么那个序列号已经被替换成正版序列号,直接安装即可。下面是ISO文件截图:这就是光盘镜像文件,我们有多种方式可以安装它,你可以把它烧录成光盘,也可以用虚
20、拟光驱软件安装它,由于这个ISO已经被修改过了,你甚至可以直接解压它,然后运行里面的setup.exe进行安装。这里我使用虚拟光驱进行说明,首先我假设你已经安装好了虚拟光驱软件DAEMONToolsLite,如果你还没有安装,请去游侠补丁网下载,因为在那里你总是能找到最新的免费版本。接下来我们通过虚拟光驱加载刚才下载好的ISO镜像:在弹出的对话框中选择我们下载好的ISO文件。这个时候,虚拟光驱里面已经替我们打开了ISO文件,有的机器可能会自动弹出安装提示,有的不会。如果自动弹出安装提示,那么直接通过即可,如果没有弹出,那么用资源管理器方式进入虚拟光驱点击Setup.exe即可开始安装。由于我已
21、经安装好了VS201*,所以接下来无法给大家截图了,我就直接用文字描述吧。当弹出VS201*安装程序之后点下一步,然后我们可能会看到完全最小自定义这样的选项,我推荐大家选择自定义,因为只有这样我们才可以自定我们安装的目录。接下来会选择安装的组件。这个时候我们会看到大量的VS201*的组件,这里我们可以选择是否安装Basic是否安装C#等等,我在网上找到一些图片,虽然跟中文版201*不一样,大家大概的样子是一样的,大家就凑合着看看吧。下面是开始的界面,我们应该选择安装VS201*.上面这个时候选择同意。然后安装包会开始搜集信息:选择目录:然后就是开始安装了,注意安装的时候可能需要重启一两次。最后
22、安装成功:配置当安装成功之后,我们就可以开始使用了,这里我先教大家做一些常见的配置,当然大家也可以直接用默认的设置,我这样配置主要是为了方便。下面通过开始菜单来启动VS201*吧:如果你是第一次开始,那么可能会让你选择默认的环境设置,我们要使用VC当然选择VC的配置:出现下面的画面表示已经成功安装和运行了。这是起始页面,以后你会经常见到它。注意,你可能会没有VAssistX这个菜单,因为这个是个外部工具,以后会给大家解释它的用处,现在暂时忽略。接下来让我们来做一些常见的设置。通过菜单工具选项调出配置对话框,下面是一些常见的设置:调处行号,选择文本编辑器,所有语言,把行号打成勾。如果你想调整字体
23、或者颜色,那么可以在这里选择:单击工具栏的空白区域,让我们把生成工具栏调出来:这样我们就可以直接在工具栏上面选择编译项目、编译整个解决方案、运行程序和调试程序了。选择生成工具栏旁边的小三角形可以自定,我们还可以添加一些按钮:单击自定义界面下面的添加按钮就可以添加新的按钮了,现在我们把开始执行(不调试)添加工具栏中:以前经常有人问我为什么我的程序闪一下就没了,这就是因为它们把调试(F5,那个实心的三角形)当成了运行(不调试,Ctrl+F5,空心带尾巴的三角形)了。当然是一闪而过啦。关于调试以后说到。HelloWorld.下面让我们用VC+201*也就是VC10来做一个控制台的HelloWorld
24、程序吧。VC201*里面不能单独编译一个.cpp或者一个.c文件,这些文件必须依赖于某一个项目,因此我们必须创建一个项目。有很多种方法都可以创建项目,可以通过菜单:文件,新建,项目;也可以通过工具栏点击新建项目进行创建。这里我们点击起始页面上面的新建项目:点击之后进入新建项目向导:上面选择Win32控制台应用程序,名称中输入HelloWorld点确定,至于是否为解决方案创建目录我们暂时不管,那主要区别在于解决方案是否和项目文件在同一目录。接下来进入创建页面,在Win32应用程序向导的第一个页面直接点下一步即可:下个页面记得选择空项目,我们不需要预编译头:点击完成。这时候一个空的项目编译成功了,
25、我们不妨编译一些试试。点击刚才添加的生成工具栏的生成按钮:这时候我们会遇到编译错误,为什么呢?因为我们还没有Main函数,对于一个C+项目来说,一定要有一个且仅有一个main函数(Windows程序需要WinMain,区别以后再讲),可以是隐式提供也可以是显式提供,至于区别以后会讲到。现在让我们记住这个错误,以后遇到这个错误的时候一定要想想,我们项目中是否有Main函数。注意这时候即使你托一个有Main函数的文件到VC10中进行编译也是没有意义的,因为那个文件并不是我们项目的一部分。现在我们可以添加一个代码文件进来了,这个代码文件可以是已经存在的也可以是新建的,这里新建一个。右键单击项目名称,
26、选择添加,新建项:在向导中选择代码、C+文件(.cpp),名称输入Main,确定。这时候已经成功添加了一个Main文件,注意添加新文件的时候要防止重名:然后我们输入最简单的几行代码,然后编译它吧,编译方法和上面一样。如果编译成功你会看到上面的画面,如果失败会有错误提示,那么你可以根据提示去修改项目配置或者代码。然后让我们用Ctrl+F5或者点那个空心三角形运行一下吧:OK了,接下来你可以通过更改这个程序去练习C+教材上面的程序了。这一章的内容就是这么多了,下一章中我们将讨论以下内容:什么是C+?什么是编程等等。第三章关于C+的一些问题这一回我自己都不知道应该写点什么好,或许今天的篇幅会比往常短
27、很多。我说过,这不是C+的教程,因为我还没有那个能力来教大家C+,我能做的,是分享一些学习的经验,以及教新手如何使用VC201*这个工具去练习和实践其它C+教材上面的程序,如C+Primer等。今天说的是我学习和使用C+这些年来对C+的一些理解,这样的日志其实是最难写的,因为众口难调,为什么这么说呢?同样的一段音乐不同的人去倾听都会有不同的感受,不同的心境去听也会有不同的感觉。记得当年我在听雅尼的IfIcouldtellyou听到的是无尽的伤感和无奈,而我的朋友却怎么也听不出来,呵,你去听听之后会有什么感觉?好,回归正题吧。什么是编程下面这段话我是从百度百科“编程”词条复制过来的,不敢掠人之美
28、:编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。这段话说的比较明白,我们如果想让计算机按照我们想要的方式工作,那么我们必须给它命令,有的常见的任务已经由操作系统帮助我们提供了,操作系统将一些简单的指令封装成一个简单的操作,使得我们的操作更容易更简单,然而操作系统提供的操作始终是有限的,如果要扩展计算机的软件系统,就需要编程了。什么是编程语言如上
29、所说,编程语言就是人类与计算机交流的桥梁。首先编程语言必须是计算机可以理解的或者是可以间接转换成计算机可以理解的指令的东西。打个比方,如果你在一台普通电脑面前站着,大叫道:“电脑,给哥把C盘根目录下面的A文件拷贝到D盘根目录下面去”。我猜想你就算叫上一天也没用,因为普通的电脑无法识别你的指令,这就算是对“机”弹琴吧。什么是编译器如上所说,编程语言是计算机可以直接理解的如机器码或者可以间接转换成计算机可以理解的指令的东西。那么C+就属于后者,那么是什么把C+翻译成计算机可以识别的指令的呢?这就是编译器。什么是C+我不想说C+的历史了,我想说,它是一门编程语言,它可以通过编译器的翻译成为计算机可以
30、识别的指令。比如我们常见的C+代码:inta=3+1;cout些新的类,引用一些新的命名空间,其实C+也是这样的,要做更具体的事情,就需要除C+本身之外的更多东西才行。因此,要用C+来做事情,除了C+的基本语法之外,还需要学习一些其它一些内容如WindowsAPI、MFC、DirectX3DAPI等。C+、C#、Java到底谁好?对于这个问题,我想说的是:语言无贵贱,技术有高低。其实无论什么语言,它们在这里都是编程语言,也许它们看起来不一样,它们用起来也不一样,它们的“翻译”编译器不一样,但是它们的本质作用就是要用它们自己的方式将我们人类的解决问题的方法、思路和流程告知给计算机。这也就是为什么
31、C+、C#、Java可以相互交互的原因。每个语言就像江湖上的各门派的武功一样,其实真的没有高下之分,只有个人的修为,少林武功就一定强于武当么?碧血剑中袁承志不也用普普通通的五行拳击溃了荣彩么?只是不同的武功在不同的条件下表现不同,他们各自占据了自己有利的地位罢了,以杨家枪法为例,或许二人比武它不厉害,但是征战沙场估计是再适合不过了。因此不要再纠结什么语言好,什么语言流行了,选择一个自己喜欢的方向,然后调查好那个方向最常用最适合的语言,然后集中注意力坚持的去学习它,这就好了。今天的内容就是这些,希望对大家有帮助。请大家务必好好学习C+教材,并使用VC201*好好演练,最好能够举一反三自己创造问题
32、自己解决!多看看百度知道C/C+下面的那些问题,每解决一个那样的问题,你自己也会进步。第四章VC201*中初学者常见错误、警告和问题这一章将帮助大家解释一些常见的错误、警告和问题,帮助大家去理解和解决一些常见问题,并了解它的根本原因。iostream.h与下面的代码为什么在VC201*下面编译不过去?#includeintmain()cout错误信息:fatalerrorC1083:无法打开包括文件:“iostream.h”:Nosuchfileordirectory造成这个错误的原因在于历史原因,在过去C+98标准尚未订立的时候,C+的标准输入输出流确实是定义在这个文件里面的,这是C风格的定
33、义方法,随着C+98标准的确定,iostream.h已经被取消,至少在VC201*下面是这样的,取而代之的是我们要用头文件来代替,你甚至可以认为是这样定义的:namespacestd#includeiostream.h因此我们可以简单的修改我们的HelloWorld。#includeusingnamespacestd;intmain()cout上面的strcpy会产生这个警告:warningC4996:strcpy:Thisfunctionorvariablemaybeunsafe.Considerusingstrcpy_sinstead.Todisabledeprecation,use_CR
34、T_SECURE_NO_WARNINGS.Seeonlinehelpfordetails.这是因为VC从201*版本开始,微软引入了一系列的安全加强的函数来增强CRT(C运行时),这里对应的是strcpy_s。_s意为safe的意思,同样的道理,strcat也是同样。因此要解决这个问题,我们可以用strcpy_s来替换strcpy,但是注意strcpy_s并非所有编译器都提供,因此如果要跨编译器,请采用错误信息中所提示的方式,定义_CRT_SECURE_NO_WARNINGS宏来掩耳盗铃吧。另外注意并非所有的加强函数都是在屁股后面加_s,比如stricmp这个字符串比较函数的增强版名字是_st
35、ricmp。下面,用strcpy_s来更改程序:intmain()charsz128=0;strcpy_s(sz,HelloWorld!);coutreturn0;貌似没什么问题吧?错了,如果你是按照我教你的方法创建的控制台空工程的话,那么会有编译错误:errorC2664:“MessageBoxW”:不能将参数2从“constchar17”转换为“LPCWSTR”这个问题太普遍了,几乎所有的初学者都会遇到而且感到难以应付,因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6下面应该是没有任何问题的,那问题出现在哪里呢?问题在这里,请右键单击解决方案浏览器
36、下面的项目,属性,问题的根本就是字符集问题,在VC6中,我们默认使用的是多字节字符集,而现在我们默认需要的是UNICODE字符集,简单的,我们把这个字符集改成多字节字符集这个问题就解决了:再试试应该就可以了吧?但是我并不推荐大家这么做,因为让自己的程序适应各种字符集是我们写代码的人义不容辞的义务。我们把程序改成下面这样:#include#include#includeusingnamespacestd;intmain()MessageBox(NULL,TEXT(你好HelloWorld!),TEXT(Information),0);MessageBox(NULL,_T(你好HelloWorld
37、!),_T(Information),0);return0;用两个宏TEXT或者_T都可以解决这个问题,它们两个并没有太大区别,也许区别在于前者是通过windows.h头文件引入的,而_T是通过tchar.h引入的,我推荐大家使用_T和tchar.h,因为tchar.h还帮助我们引入了其它一些很有用的宏,比如_tcscpy_s,这个宏在使用UNICODE字符集的时候被替换成wcscpy_s,在使用多字节字符集的使用被替换成strcpy_s。关于这部分的内容,请大家不要错过Windows核心编程的第二章(第四版或第五版都可以),以及深入学习C+String2.1版。它们都有提到。有人听说_T可以
38、把多字节字符串转换成UNICODE,因此他写了如下的代码:constchar*pStr=haha哈哈;MessageBox(NULL,_T(pStr),_T(Information),0);当然,除非你运气好的抓狂,否则你是编译不过去的,为什么呢?我们现在应该知道对于Hello这样的字符串,VC201*会默认的将它视为constchar*,即多字节字符串,而LHello前面有个L前缀的被视为UNICODE字符串,这和C#是有区别的,因为C#的字符串总是被视为UNICODE,C+/CLI下面编译器也会帮助我们做到这件事情,所以它们不需要L(C+/CLI兼容L这种写法)。让我们看看_T的定义吧:#
39、definewxCONCAT_HELPER(text,line)text#line/*couldalreadybedefinedbytchar.h(itsquasistandard)*/#ifndef_T#if!wxUSE_UNICODE#define_T(x)x#else/*Unicode*/*usewxCONCAT_HELPERsothatxcouldbeexpandedifitsamacro*/#define_T(x)wxCONCAT_HELPER(L,x)#endif/*ASCII/Unicode*/#endif/*!defined(_T)*/_T在UNICODE下面最终会被替换成L#
40、x。#是一个编译预处理指令,意味着让L和x贴在一起,比如L#Hello最终就是LHello,因此它可以把Hello转换成UNICODE字符串。那为什么上面的程序不行呢?让我们看看_T(pStr)会被替换成什么:L#pStr-LpStr,哦,LpStr是一个新的标识符,如果你没有定义过它,你当然不能通过编译啦。因此我们可以了解到_T这样的宏只能处理直接的常量字符串,不能处理其它的情况。而我们上面演示的那种情况需要我们动态的去转换编码,Windows有API可以帮助我们做到,C库也有函数可以帮助我们。恰好我曾经写过这样的代码,欢迎大家参考:ASCII/UNICODE/UTF8字符串互相转换的C+代
41、码对于_T宏,再说一点东西,或许你会感到奇怪为什么_T不直接定义成#define_T(x)L#x,而要绕个圈子去调用wxCONCAT_HELPER呢?这实际上涉及到宏展开顺序和截断的问题。在这里,我们需要说一个宏参数的概念,这很函数的参数是类似的,这里_T(x)的x就是宏参数,好,记住下面一句话:如果你定义的宏中使用了#或者是#的话,宏参数将不会被展开,也就是说_T(x)如果直接定义成L#x那么在下面这种情况就会出错(PS:#是给参数加引号的意思):_T(_FUNCTION_),_FUNCTION_是一个预定义的宏,它代表了当前函数的名字,这个展开会是什么呢?L_FUNCTION_。为什么间接
42、调用wxCONCAT_HELPER就能得到正确的结果呢?因为当我们调用wxCONCAT_HELPER的时候,_FUNCTION_已经被_T展开成了函数名。说多了说多了,如果你觉得复杂可以暂时跳过这些东西,我只是顺便说说。重定义的编译错误和链接错误让我们在项目里面再添加一个Test.h头文件,方法是右击解决方案中的项目,添加,新建项,C+头文件,名称输入test.h。然后我们在test.h中输入:/*#pragmaonce*/voidprint()回到main.cpp中:#includeusingnamespacestd;#includeTest.h#includeTest.hintmain()
43、return0;编译一下我们会得到重定义的编译错误:errorC2084:函数“voidprint(void)”已有主体或许你会说,你引用(#include)了两次,我没你那么傻,我只引用一次不就好了么?是的。你聪明,但是是小聪明哈,因为你不能保证每个人都不去引用它。这个问题演示的是#pragmaonce的用处,让我们解开它的注释。编译成功!#pragmaonce的作用就在于防止头文件被多次引用。你或许见过#ifndef_TEST_H_#define_TEST_H_代码#endif这样的代码,它们的作用是一样的,如果你跟我一样懒,那么就用#pragmaonce,如果你打算去没有这个指令的编译器
44、上编译代码,那么还是用后面一种方式吧。现在让我们来见识一个对初学者稍微复杂一点的链接错误,用创建main.cpp的方法再添加一个test.h头文件,输入#includeTest.h即可。让我们再编译一次。1test.obj:errorLNK201*:void_cdeclprint(void)(?printYAXXZ)已经在Main.obj中定义1e:documentsvisualstudio201*ProjectsHelloWorldDebugHelloWorld.exe:fatalerrorLNK1169:找到一个或多个多重定义的符号如果说编译错误好找的话,链接错误对于初学者来说就有点麻烦了
45、,聪明的初学者会去Google、百度寻找答案,笨的初学者就会找所谓的高手、前辈问,而这些高手Or前辈未必有心情为你解释。要解决这个错误有无数种方法。1.内联,把print声明为内联函数。inlinevoidprint()这个方法的好处是简单,坏处是局限性太强,意味着你总是需要公开print的实现,因为内联函数必须在编译时就知道实现才行。2.static,把print声明为static函数:staticvoidprint()。这便告诉编译器,哥是唯一的,而且哥只能被本编译单元的代码调用,这和extern是对应的。简单来说,想要哥帮你做事,请先include哥声明的头文件,也就是#includet
46、est.h。3.h头文件中只放声明,实现放到.cpp中去。现在test.h中只有voidprint();,而实现在test.cpp中:#includeTest.hvoidprint()inta=1;cout我把不同功能的代码和文件放在不同的Filter下面,如何添加这样的Filter呢?这样就可以添加筛选器了,默认情况下VS为我们创建三个筛选器:头文件、源文件和资源文件,实际上我们可以再增加很多。这样区分开的好处就是各个功能的代码被分开了,在文件很多的情况下不会造成混乱。如TextSearcher,它的搜索算法、软件控制逻辑、自定义控件、GUI模块、线程化操作都是分开的,这样我可以很容易找到我
47、想找的文件,而且还可以检视自己的模块划分是否合理等等。接下来推荐大家在项目资源浏览器中为不同的文件划分目录。比如上图将头文件和源文件、资源图标文件、本地化文件和配置文件分开组织,这样也是为了防止混乱。值得注意的是当我们把文件用文件分开的时候,需要在项目属性设置里面包含我们的子目录,否则我们无法在源文件中直接用#include指令包含我们的头文件。如下图所示这样的情况,如果不添加,无法找到头文件。如下图所示,找到项目属性中,C+,常规中把我们的子目录作为附加路径添加到“附加包含目录”中。使用SVN或其它源代码管理工具管理我们的项目如果你打算写一个比较大一点的项目,我推荐你使用源代码管理工具来管理你的C+项目,你可以选择SVN,也可以选择其它的,我推荐SVN,因为简单容易上手。当你在做一个很复杂的东西的时候,花了两三天的时间去做修改,不过后来发现这个修改并不合适,想还原到三天以前,如果你没有用源代码管理工具管理自己的项目也没有自己手动的备份,那恭喜你,你得开始人肉还原了,这是多么悲剧的一件事情啊,然而如果你使用了SVN管理的话,只需要在三天前开始修改前的最后一次稳定版本Commit一次,三天之后如果要还原,只需要使用工具Revert就好了,而且不但可以回到三天前的版本,你甚至可以回到以前每一次Commit的版本,(o)哇,这是多么好的工具啊!要使