
1.2.1 Visual C++介绍
Visual C++是Microsoft公司的Visual Studio开发工具箱中的一个C++程序开发包。Visual Studio提供了一整套开发Internet和Windows应用程序的工具,包括Visual C++, Visual Basic,Visual FoxPro,Visual InterDev,Visual J++以及其他辅助工具,如代码管理工具Visual SourceSafe和联机帮助系统MSDN。Visual C++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。
从最早期的1.0版本发展6.0版本,到最新的.NET版本,Visual C++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。
Visual C++一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。
1.2.2 Visual C++的安装和启动
如果你的计算机未安装Visual C++6.0(有条件有时间一定要自己安装练习!),则应先安装Visual C++6.0。Visual C++是Visual Studio的一部分,因此需要Visual Studio 的光盘,执行其中的setup.exe,并按屏幕上的提示安装即可。安转完毕后,在Windows的 “开始” 菜单的程序子菜单中会出现“Microsoft visual Studio”子菜单,如图1-1所示
图1-1 Microsoft visual Studio 启动子菜单
在需要使用Visual C++时,只需从桌面上顺序选择“开始”程序 “Microsoft visual Studio”Visual C++6.0命令即可,此时屏幕上在短暂显示VisualC++6.0的版权页面后,出现Visual C++6.0的由窗口、工具条、菜单、工具及其他部分组成的一个主界面。通过这个界面,用户可以创建、测试、调试应用程序。如图
图1-2 Visual C++6.0界面
1.2.3 常用功能键及其意义(写在你抬眼就能看到地方,尽快记住并熟练使用他们!今天跳过)
为了使程序员能够方便快捷地完成程序开发,开发环境提供了大量快捷方式来简化一些常用操作的步骤。键盘操作直接、简单,而且非常方便,因而程序员非常喜欢采用键盘命令来控制操作。下面是一些最常用的功能键,希望在实验中逐步掌握。
| 操作类型 | 功能键 | 对应菜单 | 含义 |
| 文件操作 | Ctrl+N | File|New | 创建新的文件、项目等 |
| Ctrl+O | File|Open | 打开项目、文件等 | |
| Ctrl+S | File|Save | 保存当前文件 | |
| 编辑操作 | Ctrl+X | Edit|Cut | 剪切 |
| Ctrl+C | Edit|Copy | 复制 | |
| Ctrl+V | Edit|Paste | 粘贴 | |
| Ctrl+Z | Edit|Undo | 撤消上一个操作 | |
| Ctrl+Y | Edit|Redo | 重复上一个操作 | |
| Ctrl+A | Edit|Select All | 全选 | |
| Del | Edit|Del | 删除光标后面的一个字符 | |
| 建立程序操作 | Ctrl+F7 | Build| Compiler current file | 编译当前源文件 |
| Ctrl+F5 | Build|Run exe | 运行当前项目 | |
| F7 | Build|Build exe | 建立可执行程序 | |
| F5 | Build|Start Debugging | 启动调试程序 | |
| 调试 | F5 | Debug|Go | 继续运行 |
| F11 | Debug|Step into | 进入函数体内部 | |
| shift+F11 | Debug|Step out | 从函数体内部运行出来 | |
| F10 | Debug|Step over | 执行一行语句 | |
| F9 | 设置/清除断点 | ||
| Ctrl+F10 | Debug|Run to cursor | 运行到光标所在位置 | |
| shift+F9 | Debug|QuickWatch | 快速查看变量或表达式的值 | |
| Shift + F5 | Debug|Stop debugging | 停止调试 |
图1-3 快捷键命令菜单与按钮
1.2.4 输入和编辑源程序
先介绍最简单的情况,即程序只由一个源程序文件组成,即单文件程序(有关对多文件程序的操作在本章的稍后介绍或者下次再看)。
1、新建一个C++源程序的方法
如果要新建一个C++源程序,可采取以下的步骤:
在Visual C++主窗口的主菜单栏中选择File(文件)命令,然后选择New(新建)命令,如图1-4。
图1-4 选择File菜单中的New操作
图1-5 创建一个C++源文件
这时,展幕上出现一个New(新建)对话框,单击此对话框的上方的Files(文件)属性页,在列表中选择“C++ Source File”项,表示要建立新的C++源程序文件,然后在对话框右半部分的Location(目录)文本框中输入准备编辑的源程序文件的存储路径(假设为D:\国土系0501-20060405-张三\实验一),表示准备编辑的源程序文件将存存放在“D:\ 国土系0501-20060405-张三\实验一”子目录下。在其上方的File(文件)文本框中输入准备编辑的源程序文件的名字(输入MyFirstCpppp),如图1-5。这样,即将进行输入和编辑的源程序就以MyFirstCpp.cpp(一定要注意文件名是指文件长名MyFirstCpp和短名即扩展名cpp)为文件名存放在D盘的“\国土系0501-20060405-张三\实验一”目录下,如图1-6。当然,读者完全可以指定其他路径名和文件名。
图 1-6 C++文件建立成功
在单击OK按钮后,回到Visual C++主窗口,由于在前面已指定了路径(D:\ 国土系0501-20060405-张三\实验一)和文件名(MyFirstCpp.cpp),因此在窗口的标题栏中显示出MyFirstCpp.cpp。可以看到光标在程序编辑窗口闪烁,表示程序编辑窗口已激活,可以输入和编辑源程序了。这里输入如图1-7窗口中所示的程序。检查无误后,则将源程序保存在前面指定的文件中,方法是:在主菜单栏中选择File(文件)命令,并在其下拉菜单中选择Save(保存)命令。也可以用快捷键Ctrl+S来保存文件。如果不想将源程序存放到原先指定的文件中,可以不选择Save命令,而选择Save As(另存为)命令,并在弹出的Save As(另存为)对话框中指定文件路径和文件名。
图1-7 C++程序输入
2、打开一个已有的程序
如果你已经编辑并保存过C++源程序,而希望打开你所需要的源程序文件,并对它进行修改,方法是:
(1)在“资源管理器”或“我的电脑”中按路径打到已有的C++程序名(如C1-1.cpp)。
(2)双击此文件名,则进入Visual C++集成环境,并打开了该文件,程序已显示在编辑窗口中。也可以用Ctrl+O或单击工具栏中的小图标 来打开文件。
(3)如果修改后仍想保存在原来的文件中,可以选择File(文件)→Save(保存)命令,或用快捷键Ctrl+S,或单击工具栏中的小图标 来保存文件。
3、通过已有的程序建立一个新程序的方法
如果你已编辑并保存过C++源程序(而不是第一次在该计算机上使用Visual C++)的话,则可以通过一个已有的程序来建立一个新程序,这样做比重新输入一个新文件省事,因为可以利用原有程序的部分内容。方法是:
(1)打开任何一个已有的源文件,(例cl-1.cpp)
(2)利用该文件的基础修改成新的文件然后通过选择File(文件)→Save as(另存为)命令将它以另一文件名另存(如以test.cpp名字另存),这样就生成了一个新文件test.cpp。
用这种方法很方便,但应注意:
(1)保存新文件时,不要错用File→Save(保存)操作,否则原有文件(cl-1.cpp)的内容就被修改了。
(2)在编译新文件前,应先选择File(文件)→Close Workspace(关闭工作区)命令将原有的工作区关闭,以免新文件在原有的工作区进行编译。
1.2.5 编译、连接和运行
1、程序的编译(现在你已经知道编译的作用吗?)
在编辑和保存了源文件以后,需要对该源文件进行编译。单击主菜单栏中的Build(编译),在其下拉菜单中选择Compile MyFirstCpp.cpp(编译MyFirstCpp.cpp)命令。由于建立(或保存)文件时已指定了源文件的名字MyFirstCpp.cpp,因此在Build菜单的Compile命令中显示了现在要编译的源文件名MyFirstCpp.cpp。见图1-8:
图1-8 编译C++程序
在选择“编译”命令后,屏幕上出现一个对话框,内容是“This build command repuires an active project workspace.Would you like to creat a default project workspace?”(此编译命令要求一个有效的项目工作区。你是否同意建立一个默认的项目工作区 没有中文你能看懂吗?是否被吓着了?),见图1-9。单击Yes(是)按钮,表示同意由系统建立默认的项目工作区,然后开始编译。也可以不用选择菜单的方法,而用Ctrl+F7或小图标 来完成编译。
图1-9 建立默认工作区提示
在进行编译时,编译系统检查源程序中有无语法错误,然后在主窗口下部的调试信息窗口输出编译的信息,如果有错,就会指出错误的位置和性质,见图1-10。(永远记住:编程就是犯错,改错直到成功!如果一开始就正确无误,可能就没有编程了。所以我批评你就当是我在犯错!)
图1-10 编译错误信息提示
2、程序的调试(结合教材中课文和简单练习做实验)
程序调试的任务是发现和改正程序中的错误,使程序能正常运行。编译系统能检查出程序中的语法错误。语法错误分两类:一类是致命错误,以error表示,如果程序中有这类错误,就通不过编译,无法形成目标程序,更谈不上运行了。另一类是轻微错误,以warning(警告)表示,这类错误不影响生成目标程序和可执行程序,但有可能影响运行的结果。因此也应当尽量改正,使程序既无error,又无warning。
在图1-10中的调试信息窗口中可以看到编译的信息,指出源程序有一个error和一个warning。第7行有致命错误,错误的种类是:在“}”之前漏了“;”。检查图1-10中的程序,果然发现在第6行末漏了分号。同学们可能要问:明明是第6行有错,怎么在报错时说成是第7行的错呢?这是因为C++允许将一个语句分写成几行,因此检查完第6行末尾无分号时还不能判定该语句有错,必须再检查下一行,直到发现第7行的“}”前都没有“;”,才能判定出错。因此在第7行报错。在根据编译报错信息检查程序时,应检查其上下行。此外编译信息指出第7行还有一个warning,指出main函数需要有一个返回值,程序中缺少一个“return 0;”语句。
进行改错时,双击调试信息窗口中的某个报错信息的第1行,光标就自动移到程序窗口中被报错的程序行,并用粗箭头指向该行。见图1-11。
图1-11 发现错误位置
在第6行末加上分号。再增加新的一行return 0; 如图1-12:
图1-12 错误修改
再选择Compile MyFirstCpp.cpp命令重新编译,此时编译信息提示:“0 error(s),0 warning(s)”,即没有致使错误(error)和警告性错误(warning),编译成功,这时产生一个MyFirstCpp.obj文件。见图1-13中的下部调试信息窗口。
图1-13 语法编译通过
3、程序的连接(现在你已经知道连接/链接的作用吗?)
在得到目标程序后,就可以对程序进行连接了。此时应选择Build(构建)→Build MyFirstCpp.exe(构建MyFirstCpp.exe)命令,见图1-14。表示要求连接并建立一个可执行文件MyFirstCpp.exe。
图1-14 连接建立可执行文件
在执行连接后,在调试输出窗口显示连接时的信息,说明没有发现错误,生成了一个可执行文件MyFirstCpp.exe。见图1-15。
图1-15 可执行文件建立成功
以上介绍的是分别进行程序的编译与连接,也可以选择Build→命令(或按F7键)一次完成编译与连接。对于初学者来说,还是建议分步进行程序的编译与连接,有利于对程序编译、解释、连接过程的理解。今后积累一定经验后,可以一步完成编译与连接。
4、程序的执行(祝贺你到这里!)
在得到可执行文件MyFirstCpp.exe后,就可以直接执行MyFirstCpp.exe了。选择Build→!Execute test.exe(执行MyFirstCpp.exe)命令。见图1-16。
图1-16 运行程序可执行文件
在选择“!Execute test.exe”命令后,即开始执行MyFirstCpp.exe。也可以不通过选择菜单命令,而且Ctrl+F5来实现程序的执行。程序执行后,屏幕切换到输出结果的窗口,显示出运行结果,见图1-17。
图1-17 程序运行结果
可以看到,在输出结果的窗口中的第1行是程序的输出结果:
This is a C++ program.
第2行“Press any key to continue”并非程序所指定的输出,而是Visual C++在输出完运行结果后由Visual V++6.0系统自动加上的一行信息,通知用户“按任何一键以便继续”。当你按下任何一键后,输出窗口消失,回到Visual C++的主窗口,你可以继续对源程序进行修改补充或进行其他工作。
如果已完成对一个程序的操作,不再对它进行其他处理,应当选择File(文件)→Close Workspace(关闭窗口)命令,以结束对该程序的操作。
1.2.6 建立和运行包含多个文件的程序的方法
上面介绍的是最简单的情况,一个程序只包含一个源程序文件。如果一个程序包含多个源程序文件,则需要建立一个项目文件(project file),在这个项目文件中包含多个文件(包括源文件和头文件)。项目文件是放在项目工作区(Workspace)中并在项目工作区的管理之下工作的,因此需要建立项目工作区,一个项目工作区可以包含一个以上的项目。在编译时,先分别对每个文件进行编译,然后将项目文件中的文件连接成为一个整体,再与系统的有关资源连接,生成一个可执行文件,最后执行这个文件。
在实际操作时有两种方法:一种是由用户建立项目工作区和项目文件;另一种是用户只建立项目文件而不建立项目工作区,由系统自动建立项目工作区。
1、由用户建立项目工作区和项目文件
(1)、先用前面介绍过的方法分别编辑好同一程序中的各个源程序文件,并存放在自己指定的目录下,例如有一个程序包括filel.cpp和file2.cpp(这样文件名称很不好,你知道为什么吗?)两个源文件,并已把它们保存在“D:\国土系0501-20060405-张三\实验一”子目录下。
(2)、建立一个项目工作区。在如图1-4所示的Visual C++主窗口中选择File(文件)→New(新建)命令,在弹出的New(新建)对话框中选择上部的选择属性页Workspace name(工作区名字),表示要建立一个新的项目工作区。在对话框中右部Workspace name(工作区名字)文本框中输入你指定的工作区的名字(如wsl),见图1-18。
图1-18 建立工作区
然后单击右下部的OK按钮。此时返回Visual C++主窗口,见图1-19。
图1-19 一个空的工作区
可以看到在左部的工作区窗口中显示了“Workspace ws1:0 project(s)”,表示当前的工作区名是wsl,其中有0个project(没有在其中放入项目文件)。
(3)、建立项目文件。选择File(文件)→New(新建)命令,在弹出的New(新建)对话框中选择上部的选择属性页Projects(项目,中文Visual C++把它译为“工程”),表示要建立一个项目文件。见图1-20。
图1-20 建立一个新的项目
在对话框中左部的列表中选择“Win32 Console Application”项,并在右部的location(位置)文本框中输入项目文件的位置(即文件路径),在Project name(中文界面中显示为“工程”)文本框中输入你指定的项目文件名,假设输入projectl。在窗口右部选中Add to current workspace(添加至现有工作区)单选钮,表示新建的项目文件是放到刚才建立的当前工作区中的。然后单击OK(确定)按钮。此时弹出一个如图1-21所示的对话框,在其中选中An empty project单选钮,表示新建立的是一个空的项目。
图1-21 项目类型选择
单击Finish(完成)按钮。系统弹出一个New Project Information(新建工程信息)对话框(图1-22),显示了刚才建立的项目的有关信息。
图1-22 新建项目的信息
在其下方可以看到项目文件的位置(文件路径)。确认后单击OK(确定)按钮。此时又回到Visual C++主窗口,可以看到:左部窗口中显示了“Workspace’wsl’:1project(s)”其下一行为“project1 files”,表示已将项目文件project1加到项目工作区wsl中,见图1-23。
图1-23 工作区中加入一个新项目
(4)、将源程序文件放到项目文件中。方法是:在Visual C++主窗口中依次选择Project(工程)→Add To Project(添加到项目中,在中文界上显示为“添加工程”)→“Files…”命令,见图1-24。
图1-24 文件加入到项目中
在选择“Files…”命令后,屏幕上出现Insert Files into Project对话框。在上部的列表框中按路径找到源文件file1.cpp和file2.cpp所在的子目录,并选中file1.cpp和file2.cpp,见图1-25。
图1-25 加入文件选择
单击OK(确定)按钮,就把这两个文件添加到项目文件project1中了。
(5)、编译和连接项目文件。由于已经把file1.cpp和file2.cpp两个文件添加到项目文件project1中,因此只须对项目文件project1进行统一的编译和连接。方法是:在Visua1 C++主窗口中选择Build(编译)→Build project1.exe(构建project1.exe)命令。
在选择Build project1.exe命令后,系统对整个项目文件进行编译和连接,在窗口的下部会显示编译和连接的信息。如果程序有错,会显示出错信息,如果无错,会生成可执行文件project1.exe。见图1-26。
图1-26 项目的编译和连接
执行可执行文件。选择Build(编译)→Execute project1.exe(执行project1.exe)命令,即可。
2、用户只建立项目文件
上面介绍的方法是先建立项目工作区,再建立项目文件,步骤比较多。可以采取简化的方法,即用户只建立项目文件,而不建立项目工作区,由系统自动建立项目工作区。
在本方法中,保留上一节中介绍的第(1)、(4)、(5)、(6)步,取消第(2)步,修改第(3)步。具体步聚如下:
(1)分别编辑好同一程序中的各个源程序文件。同上一节中的第(1)步。
(2)建立一个项目文件(不必先建立项目工作区)。
在 Visual C++主窗口中选择File(文件)→New(新建)命令,在弹出的New(新建)对话框中选择上部的选项卡projects(项目),表示要建立一个项目文件。见图1-27。在对话框中左部的列表中选择“Win32 Console Application”项,在project name(中文Visual C++中显示为“工程”)文本框中输入你指定的项目文件名(project1)。可以看到:在右部的中间的单选钮处默认选定了Create new workspace(创建新工作区),这是由于用户未指定工作区,系统会自动开辟新工作区。
图1-27 建立一个新的Win32 Console Application项目
单击OK(确定)按钮,出现“Win32 Console Application-step 1 of 1”对话框,选中右部的An empty project单选钮,单击Finish(完成)按钮后,出现“New project information”(新建工程信息)消息框。从它的下部可以看到项目文件的路径。单击OK(确定)按钮,在弹出的Visual C++主窗口的左部窗口的下方单击File View按钮,窗口中显示“Workspace`project1`:1 project(s)”,见图1-28。说明系统已自动建立了一个工作区,由于用户未指定工作区名,系统就将项目文件名project1同时作为工作区名。
图1-28 建立新项目成功
向此项目文件添加内容。步骤与方法一中的第(4)步相同。
编译和连接项目文件。步骤与方法一中的第(4)步相同。
执行可执行文件。步骤与方法一中的第(6)步相同。
显然,这种方法比前一种方法简单一些。在介绍单文件程序时,为了尽量简化手续,这里没有建立工作区,也没有建立项目文件,而是直接建立源文件,实际上,在编译每一个程序时都需要一个工作区,如果用户未指定,系统会自动建立工作区,并赋予它一个默认名(此时以文件名作为工作区名
1.3 Visual C++ 6.0工程相关文件介绍(你能找到前面程序的这些文件吗?)
| 序号 | 文件名 | 描述 |
| 1 | *.dsw | VC工作区文件 |
| 2 | *.dsp | (Developer Studio Project)项目文件,文本格式。不熟悉的话不要手工修改 |
| 3 | *.ncb | 无编译浏览文件。当自动完成功能出问题时,可以删除此文件,编译工程后会自动生成。 |
| 4 | *.opt | 工程关于开发环境的参数文件,如VC工具条位置信息等。 |
| 5 | *.h | C/C++程序头文件,可用文本编辑器打开 |
| 6 | *.cpp | C++源程序文件,可用文本编辑器打开 |
| 7 | *.exe | 程序可执行文件 |
| 8 | *.plg | 编译信息文件。编译时的error和warning信息文件(实际上是一个html文件),一般用处不大。在ToolsOptionsBuild里面的选项可以控制这个文件的生成。 |
| 9 | *.pch | (Pre-Compiled File)是预编译文件。可以加快编译速度,但是文件非常大 |
| 10 | *.pdb | (Program Database)记录了程序有关的一些数据和调试信息,在调试的时候有用 |
| 11 | *. obj | 源程序文件的目标文件,编译后生成 |
| 12 | *. ilk | 源程序文件的连接文件,连接后生成 |
| 注 | 在VC下建立一个工程后,会自动产生1~4类型的文件。加入*.h、*.cpp文件编译后产生7~12类型的文件。其中8~12类型的文件位于工程目录下的Debug目录下。 1-4类型的文件都是工程相关的文件,一般不要删除,因为删除后,必须手动的重新建立工程(1.2.6详细描述了如何建立一个工程)。对于大型项目来说,删除这些文件的后果很严重。 5~6类型的文件还有什么可说的,不仅不能删除这些文件,还要备份这些文件。失去这些文件是灾难性的。 7~12类型的所有文件都是可以删除的,因为再次编译连接运行程序时,会再次自动生成这些文件。 | |
1.4.1 程序错误的类型
1、严重错误(fatal error)
很少出现,通常是内部编译器出错。造成编译立即停止。
2、语法错误(error)
语法错误是指源程序中存在不符合C/C++语言语法规定的语句,例如将int写成Int,括号不匹配等。这些错误不改正是不能通过编译的。如图1-29
图1-29 语法错误
3、警告错误(warning)
对于一些在语法上有轻微毛病但不影响程序运行的错误(如定义了变量但始终未使用),编译时会发出警告信息,虽然程序能通过编译、连接、运行,但警告类的错误常常带来程序非法操作、运行错误等问题。所以,尽量改正警告错误。如图1-30
图1-30 警告错误
4、连接错误(Link error)
程序语法上没有问题,但是在连接时出现错误。这类问题常常是因为程序依赖函数、库不匹配造成的。如图1-31
图1-31 连接错误
5、逻辑错误
逻辑错误是指程序无语法错误,也能正常运行,但结果不对。这类错误常常是设计算法时的错误,计算机无法检查出来。逻辑错误是最难改正的错误之一,引起错误的原因往往可能很不起眼,比如就是一个变量没有初始化等,所以改正这类错误常常需要投入大量的精力。
6、运行错误
有时程序既无语法和逻辑错误,但是程序就是不能正常运行。多数情况下是输入数据和程序要求的数据不匹配造成的,也可能是系统的支持问题。
在C++中,语法、连接错误相对较为容易改正。而逻辑错误是最隐蔽的错误,比较难以改正。运行错误则主要是在程序强壮性、兼容性上可能存在问题,可以通过提高程序的适应能力来修正。而最容易让程序开发人员忽略的就是警告错误了,因为警告错误不一定会影响程序的运行,但是正是这种不确定性也传递给了程序的执行,你不知道程序什么时候会出问题,也许永远不会有问题,也许问题马上出现,也许问题n年后出现,谁知道。所以,一定要重视警告错误。
表1-1是C++错误的前缀描述,在遇到错误时可以根据其前缀就知道错误等级了。
| 错误等级 | 错误前缀 | 错误编号范围 | 示例 |
| 严重错误 | C1 | 001~999 | |
| 编译错误 | C2 | 001~999 | C2065: The specified identifier was not declared.(标识符,比如一个变量,未申明)。如图1-29,coutt没有申明过。 |
| 警告错误 | C4 | 001~999 | C4101: 'main' : unreferenced local variable(局部变量申明后从未使用过)。如图1-30,其中的i变量从未使用过。 |
| 链接错误 | LNK | 1000~6026 | LNK2001: unresolved external symbol "symbol". (连接指定的函数或库异常)。如图1-31,程序找不到main函数。 |
只有详细地了解了错误的原因,才能正确地改正错误。Microsoft的MSDN Library(Microsoft开发帮助文档库,如图1-32)提供了查询错误信息的功能。对于遇到的不明白的错误,同学们应该学习使用MSDN帮助文档库进行错误信息查询,获得错误信息的解释和可能的改正方法。具体方法如下:
(1)选择MSDN Library(如图1-32)的索引属性页,在“键入要查找的关键字:”中输入错误号(由错误前缀和编号组成),比如输入C2065,如图1-33所示。
图1-32 MSDN Library
(2)、在索引列表框中双击选择匹配的错误后,错误类型、可能原因、改正方法等信息则显示在窗口的右边部分。如图1-33所示:
图1-33 在MSDN Library中查找错误信息
1.5 Visual C++ 6.0调试工具使用
在开发程序的过程中,需要不断地调试自己的程序,或检查错误,或测试程序的稳定性,这就需要借助调试工具来进行。选择一个好的调试工具并能够熟练地使用它,将会使程序开发变得更加容易,从而大大提高程序开发的效率。
目前有许多调试工具,集成在Visual C++中的调试工具便具有相当强大的功能。
1.5.1 设置工程的调试属性
在Visual C++中建立一个工程(Project)时,Visual C++都会自动创建一个Debug目录,在该目录下存放在开发过程进行调试时生成的文件以及生成的可执行文件(不同类型文件的解释见1.3节 Visual C++ 6.0工程相关文件介绍),不妨将此时生成的可执行文件称为Debug 版本。在Debug 版本当中,包含着Microsoft格式的调试信息,而且不进行任何代码优化。一般情况下,在程序的开发过程中使用Debug模式。
在应用程序开发完成之后,要将程序发行时,需要编译形成另一种版本的可执行文件,称为Release版本,在Release版本中对可执行程序的二进制代码进行了优化,其中不包含任何的调试信息。要建立Release版本的可执行文件,可以选择菜单Project中的Setting命令,这时屏幕上面弹出Project Settings对话框,如图1-34所示。在Settings For下拉列表中选择Release,按OK按钮退出。
如果要在Visual C++中调试程序,则工程的应设为Debug版本。一般Visual C++建立一个工程(Project)时,默认采用Debug版本。
图1-34 设置工程的调试属性
1.5.2 学习设置断点进行单步调试
通常,一个应用程序是连续运行的,但是在程序调试的过程中,往往需要在程序的运行过程的某一阶段来观测应用程序的状态,所以必须使程序在某一地点停下来。在Visual C++中,可以通过设置断点来达到这样的目的。在设置好断点之后,当程序运行到设立断点处时就停止运行,此时就可以利用各种工具来观察程序的状态,也可以设置各种条件使程序按要求继续运行,这样就可以进一步观测程序的流向。
在Visual C++中,可以设置多种类型的断点,这些断点起作用的方式各不相同,可以将它们分为三类,即:位置断点、逻辑断点以及与Windows消息有关的断点。下面我们只介绍简单位置断点的设置方法,其它高级断点的设置可以在今后进一步学习中掌握。
1、设置位置断点
位置断点,这是一类最简单的断点类型,其设置方法也最为简单,只要把光标移到要设断点的位置(当然这一行必须包含一条有效语句);然后按工具条上的add/remove breakpoint 按钮或按快捷键F9;如图1-35:(交通来帮你了!)
图1-35 设置断点按钮
这时将会在屏幕上看到在这一行的左边出现一个红色的圆点(红灯、黄灯、没有路灯!),表示在该位置设立了一个断点,如图1-36所示。如果你想取消断点,将光标移动到设置断点的代码行,按F9。
图1-36 设置一个断点
2、启动调试
按F5或者在Build菜单中,选择Start Debug然后选择Go,就可以启动调试程序。程序会一直运行到需要用户输入或者有断点的代码处。如图1-37处的小黄箭头,表明程序运行到该处停止下来,等待下一步调试命令。
图1-37 启动调试
3、查看变量值
查看变量值有多种方式,你可以选择你喜欢的方式进行。
(1)你可以将鼠标移动到程序的变量名处,系统会自动为你显示变量的值;
(2)复杂变量(如对象)可以通过QuickWatch查看,方法是:将光标定位到所要查看值的变量处,按鼠标右键,选择QuickWatch菜单,就可以看到变量值。
(3)启动调试程序后,屏幕下方将会出现两个输出窗口,一个是Watch,另一个是Variable。Watch窗口显示变量名和变量值,你可以在Watch窗口中加上你想观察值的变量名,也可以直接从源代码中选择变量名,并把它拖动到Watch窗口中。Variable窗口显示程序当前运行上下文涉及的变量的值。 如图1-38:
图1-38 查看变量数据
4、控制程序执行
你可以控制程序单步执行(F10)、跟踪到一个函数内部(F11)、从一个函数运行出来(shift+F11)、运行到光标所在位置(Ctrl+F10),以便方便地调试程序。这些命令用于在某个局部范围详细地调试程序。你也可以通过设置断点(F9)然后用直接运行(GO或者F5)来控制程序直接运行到断点位置。如果你设置了多个断点,程序将会在遇到的第一个断点处停下来。要从断点处继续运行,可以用上面所说的各种命令(F5, F10, F11, Shift+F11, Ctrl+F10)。
图1-39 调试控制工具条
5、结束调试
要结束调试,可以按shift+F5或者选择菜单Debug|Stop Debugging。当结束调试后,所有调试窗口会自动关闭,Debug菜单也会自动还原为Build菜单。
需要很长时间掌握这些基本操作,慢慢来而不是不来!
