上海天马目录第一章:认识CodeWarrior第二章:工程和目标文件的显示和定制第三章:编译第四章:链接第五章:调试第六章:定制第七章:库函数和MicrosoftFoundationClasses(MFC)上海天马第一章认识CodeWarrior1).CodeWarrior能做些什么?A).使用C/C++进行编程B).也支持Java开发本课程仅限于应用C/C++语言在Windows平台上使用CodeWarrior进行的开发.2).CodeWarrior优点是什么?CodeWarrior能够自动地检查代码中的明显错误,它通过一个集成的调试器和编辑器来扫描你的代码,以找到并减少明显的错误,然后编译并链接程序以便计算机能够理解并执行你的程序.3).常用编程类型说明:A).应用程序(如:文本编辑器WordPad)B).庞大的商业软(如:比如象AdobePhotoshop,MicrosoftWord,CodeWarrior…)C).控制面板(controlpanels)实际上是设置系统功能的一个简单界面,比如可以在控制面板中完成.如:设置音量和鼠标移动速度这样一些参数.D).动态链接库(dynamiclinkedlibraries,DLLs)提供一些很有用的被系统和应用程序共享的函数.通常它们没有用户界面.E).插件(plug-ins)类似于DLLs,插件也是可供其它软件使用的小程序,但插件只能被特定的软件使用.上海天马第一章认识CodeWarrior4).CodeWarrior工具条介绍:4.1).文件菜单:4.2).编辑菜单上海天马第一章认识CodeWarrior4.3).查看菜单4.4).查找菜单4.5).工程菜单上海天马第一章认识CodeWarrior4.6).调试菜单4.8).窗口菜单4.9).帮助菜单4.7).VCS菜单上海天马第一章认识CodeWarrior5).CodeWarrior集成开发环境的设置上海天马第一章认识CodeWarrior5.1).通用设置5.5.1).编译设置(BuildSettings):选择是否在执行编译之前保存已打开的源文件,以及有多少内存被用于编译工作;5.5.2).IDE之外(IDEExtras):几个独立的设置.比如指定CodeWarrior是否使用一个第三方的文本编辑器——因为集成的编辑器并不是很完美,这可以通过指定一个你惯用的编辑器来替代它;上海天马第一章认识CodeWarrior5.5.3).插件设置(Plug-InSettings):供插件开发商调试他们的插件;上海天马第一章认识CodeWarrior5.5.4).隐藏文件夹(ShieldedFolders):在这里指定的文件夹在工程设计期间,或执行查找和比较操作期间,将要被忽略掉.如果在你的工程级有一个巨大的“数据”文件目录,而你又不想让这些文件降低CodeWarrior的操作速度时,这个设置就很管用了;上海天马第一章认识CodeWarrior5.5.5).资料树(SourceTrees):用于指定CodeWarrior在编译程序时用不着的目录.上海天马第一章认识CodeWarrior5.2).编辑器设置5.2.1).编辑器设置(EditorSettings):几个用于定制编辑器显示、管理文本和窗口的设置项;上海天马第一章认识CodeWarrior5.2.2).字体和制表符(FontsandTabs):设置编辑器中的文本大小、字体、制表符和其它显示设置;上海天马第一章认识CodeWarrior5.2.3).文本颜色(TextColors):用于指定特定语言元素(比如程序的注释)在编辑窗口中的显示的颜色。上海天马第一章认识CodeWarrior5.3).调试器设置5.3.1).显示设置(DisplaySettings):几个用于定制调试器显示的设置项;上海天马第一章认识CodeWarrior5.3.2).视窗化(Windowing):设定调试器如何管理它的窗口(比如隐藏所有打开的编辑器窗口);上海天马第一章认识CodeWarrior5.3.3).全局设置(GlobalSettings):几个用于定制调试器在全局层次如何工作的设置。比如当一个包含了程序调试信息的文件被打开时,是否启动这个程序;上海天马第一章认识CodeWarrior5.3.4).远程连接(RemoteConnections):允许通过TCP/IP进行远程调试。这样,你就可以在地球的另一边调试你的软件了;5.3.5).Java设置/Java调试(JavaSettings/JavaDebugging):允许你设置特定的Java编程语言选项。本课程不涉及这部分内容.5.4).RAD工具5.4.1).Layout编辑器:几个用于在CodeWarrior中定制快速应用程序开发工具的使用的设置。正如你所见到的,CodeWarrior有许多设置项和选项。设置完后点击“Save”按钮保存你所作的修改,点击“Close”按钮将忽略你所作的所有修改。在进入下一节课之前,多练习几次。昀后请确认“默认的文本文件格式(DefaultTextFileFormat)”(在编辑器设置面板中)保持为DOS设置。上海天马第二章:工程和目标文件的显示和定制2.1).工程窗口当你启动CodeWarrior后,打开file,选择new,进入如下工程窗口界面.上海天马第二章:工程和目标文件的显示和定制工程窗口用于管理整个工程的所有文件以及这个工程将要产生的目标(targets)文件。Ⅰ).一个工程包含了足够的信息来编译一个或多个目标文件。所谓的目标(target)文件就是当你编译程序时,由CodeWariior创建出来的(通常是)一个应用程序或库文件。一些程序可以编译产生多个目标文件。比如,你可以编写一个程序来创建一个DLL和一个调用该DLL的主应用程序。在CodeWarrior的工程中,你可以定义一个目标来产生DLL,定义另一个目标来产生应用程序。通过这种方式,你的工程只需编译一次就可产生所有需要的目标文件或片断。上海天马第二章:工程和目标文件的显示和定制在窗口的顶端有三个标签(tab)页:文件标签(如图2-2显示)、链接顺序标签页和目标文件标签页(后两个标签页将在后续课程中讲述)。在这几个标签页的上方,有一个用于选择要编译的目标文件的下拉菜单。在本例中,我们选择的是HelloWorld工程的调试版本。在下拉菜单的右边有几个图标,它们的存在允许你不必使用菜单命令就可以方便地编译、链接和运行这个工程。注意:在某些版本的CodeWarrior中,链接标签被称为段(segments)标签。有些人可能在某些X86的处理器上编程时使用的是分段(segmented)代码。但使用windows版的CodeWarrior工具时就不是这样,这是产生的X86代码使用的是“扁平的”(flat),或者叫做非分段的(unsegmented)内存空间。顾名思义,文件标签页列出了在工程中所有可能用到的文件。你可以通过创建一些组(用文件夹图标表示)来分门别类地管理这些文件,并可以帮助你方便地了解哪些文件将被使用。在本例中,我们将C程序(以.c为后縀名的文件)全都放到一个叫做Source的组中,同时将库文件放到另一个组中,以便整洁明了地管理这些文件。上海天马第二章:工程和目标文件的显示和定制在Sources组中有一个main.c文件。因为我们还没有编译这个工程,所以在每个文件对应的Code和Data栏中显示数字的都是零。一旦我们编译了这个工程,这些数字就将显示出来,表示源码转换为机器代码后实际的代码量和数据量。可是,库文件ANSICX86.LIB和MWCRTL.LIB后面显示的是n/a。这表示索虽然这些文件被显示在这里,但是它们并不是HelloWorld目标文件的一部分。这两个文件是用于不可调试(non-debugging)开发的,而本例不是这种情况。如果我们从菜单中修改本例的目标文件为Release(发布)版本时,这两个文件就用得上了。这时这些文件后面的Code和Data栏目就会显示相应的数值。注意:在Data和Code栏右端的Target栏目中的小子弹头也是用来表示该文件是否被当前编译生成的目标文件使用到。再往右边去,是Debug栏(用一个绿色的小虫子表示),它是用于告诉你对应的文件在编译时是否要产生调试信息。我们将在第五课中详细论述这部分内容。昀后,我们来看看在每一行昀右端的弹出菜单,它是用于打开文件、更新源码、打开包含的头文件等等操作的快捷方式,具体是什么才作,要看它所代表的项目的类型而定。现在来编译这个HelloWorld工程并看看编译后的工程窗口的情况。从Project菜单中选择Make命令来编译该工程。这将更新所有需要编译的文件并产生相应的输出文件——在本例中是HelloWorld这个应用程序。图2-2:HelloWorld程序的工程窗口(其中显示了所有包含于该程序中或用于编译该程序的文件)上海天马第二章:工程和目标文件的显示和定制从上图中我们可以看到,工程窗口发生了一些变化。Code和Data栏都显示了当前工程中对应项的相应的数字。如果你打算看看编译前后存放这些文件的目录的话,你会发现编译后在该目录下产生了一些新的文件,如下图所示。上海天马第二章:工程和目标文件的显示和定制在本例中,编译工程后在工程目录中产生了一个新的文件。这就是X86目标文件输出——生成一个叫做HelloWorldx86的应用程序。其它一些一直存在于这个目录中的文件是:.mcp文件—工程文件本省,以及.c源文件—包含了应用程序源码的文件。HelloWorldData目录中还包含了由CodwWarrior生成的各种各样的支持文件。现在你还不必去关心这些文件。如果你正在编译目标文件的调试版本,你会看到更多的文件被产生出来,这些文件中可能包含着符号(symbolic)调试信息。集成开发环境的调试器使用这些符号信息来记录在高层次源码中的操作轨迹。将在第五章中详细讲述这方面内容。现在你已经了解了这些文件是如何结合在一起被编译生成一个目标文件的。让我们来运行这个目标文件并看看它的运行结果是什么样。你双击HelloWorldx86应用程序,就会有下图所示的结果显示出来。上海天马第二章:工程和目标文件的显示和定制该程序的源代码:#includevoidmain(void){intc;printf(HelloWorldonWindows!\n);c=getchar();}关于getchar()函数字符输入函数getchar()用在这里是什么意思呢?通常,当一个应用程序执行完毕后,它就会终止,然后操作系统就会立即清除该应用程序输出.这样,当上述应用程序显示完“HelloWorldonWindows!”后,为了避免系统立即将该程序地输出清除,我们在程序中添加了一个getchar()函数,使程序在此处暂停,直到有键盘输入时整个程序会终止.这样我们才有足够的时间来看清楚该程序的输出.这是一个正常的操作,而不是一个bug.实际上,CodeWarrior也提供了一个适用于此处的库函数,这个库函数中的C控制台I/O函数步不仅可以在程序显示完毕后锁定应用程序,而且还可以让你将输出的文本信息存储到一个文件中去.上海天马第三章:编译第一步:理解编译阶段我们的前面的课程中已经学到,源程序输入完之后的工作就是要编译它。编译源程序就是计算机把你所写(通常是用C或C++编写的)的源代码进行分解、分析,然后转化为机器语言。机器语言是一种计算机能够理解阿语言,而且它运行起来比C或C++也要快得多。编译的大致过程如下:1.用C或C++编写代码:#includevoidmain(void){intc;printf(HelloWorldonWindows!\n);c=getchar();}2.进行编译。CodeWarrior编译上述代