ii.
在“添加新项”对话框中,在“类别”窗格中选择“代码”选项。在“模板”窗格中选择“C++文件”。在下方的窗格中输入新建的源文件名称,例如hello。最后,单击“添加”按钮,系统将显示如图7所示的项目及源程序编辑窗口。
图7 项目及其源程序编辑界面
在图7所示的项目及源程序编辑界面中右边窗格是源文件的编辑窗口,在此窗口中输入用户所需要编写的C程序。例如,现在输入下面的C程序代码:
例题1-1 整数溢出范例程序。
/*整型数据溢出范例。源文件:LT1-1.C*/ #include
int main(void) {
short int a,b;
a=32767; b=a+1;
printf(\,a,b);
system(\); return 0;
}/*main函数结束*/
iii.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
用户可用快捷键Ctrl-S来保存编写的源文件,也可以通过“文件”或者“编辑’菜单中相应选项来实现保存、粘贴等编辑功能。 现在请回答以下的问题: 回答以下问题
你使用的VC环境中,有哪些类型的项目文件?
(2) 编辑已存在的项目及源程序
a) 如果需要修改或者重新编译之前已经编写好的项目和源程序,可以通过“文件”菜
单下面的“打开”|“项目/解决方案”,或者通过标准工具栏中的“打开文件”按钮。这时将出现如图8所示的“打开项目”对话框。
4
iv.
图8 打开项目对话框
b) 用户可以在图8所示的“打开项目”对话框中,选择之前保存项目的文件夹以及该
项目的文件名,然后单击“打开”按钮即可。Visual C++中的项目文件夹的名称将与之前创建时给出的项目名称相同,该文件夹还将容纳所有构成该项目定义的文件。如果不加修改,则解决方案具有与项目文件夹相同的名称,而且包含项目文件夹和定义解决方案内容的文件。
用户在解决方案文件夹中可以看到该文件夹包含如下3个文件: ? 扩展名为.sln的文件,记录着关于解决方案中项目的信息。 ? 扩展名为.suo的文件,记录着应用于解决方案的用户选项。
? 扩展名为.ncb的文件,记录着与解决方案的Intellisense有关的数据。Intellisense是
在编辑器窗口中输入代码时提供自动完成和提示功能的工具。
例如在“D:\\Program Files\\MultiGen-Paradigm\\aa”文件夹中可以看到与之前创建的解决方案aa有关的3个文件:aa.sln、aa.suo和ss.ncb。
用户在项目文件夹中查看,可以看到最初有6个文件,其中名称为ReadMe.txt的文件包含该项目所有文件的内容摘要。在项目文件夹中可能存在一个文件是ProjectName. vcproj.ComputerName.UserName.user,例如之前创建的aa项目文件夹中存在文件aa.vcproj. LENOVO-DB8C1480.user.user,这个文件的作用是存储为该项目设定的选项。其中“LENOVO-DB8C1480”是作者使用的计算机名。
c) 如果希望在源代码编辑窗口中显示行号,请从主菜单上选择“工具”|“选项”,在
“选项”对话框中左边窗格选择“文本编辑器”下面的“C/C++选项”|“常规”,在右边窗格中选择“行号”即可。
(3) 编译并构建解决方案
在Visual C++中编写程序被称为“构建解决方案”,可通过F7快捷键或者选择主菜单下的“生成”|“生成解决方案”。另外还可通过单击“生成”工具栏上的相应按钮。如果程序中有错误,则会在主界面下方的输出窗格中显示错误提示信息,例如图1-17所示的窗口中提示程序存在一个错误:错误信息是“error C2146: 语法错误: 缺少“;”(在标识符“system”的前面)”,用户可按照提示在
printf(\这一行的最后面加上分号(;),然后重新选择生成解决方案,直到系统提示成功为止。
在成功创建了解决方案之后,用户可以在相应的项目文件夹中看到一个新的子文件夹Debug,例如之前创建的项目aa中出现的新文件夹是:D:\\Program Files\\ MultiGen-Paradigm\\ aa\\ debug。在该文件夹中包含多个文件。这些文件的扩展名和用途分别是;
? .exe文件:这是程序的可执行文件,仅当编译和链接步骤都成功之后才能生成该文
件。
? .obj文件:编译器根据程序源文件生成这些包含机器代码的目标文件,它们与库文
5
件一起被链接器使用,最后生成.exe文件。
? .ilk文件:该文件在重新构建项目时被链接器使用,它使链接器能够将根据修改的
源代码生成的目标文件增量地链接到现有的.exe文件,从而避免每次修改程序时都重新链接所有文件。
? .pch文件:这是预编译头文件。使用预编译头文件,大块无需修改的代码(尤其是
那些C++库提供的代码)可以被处理一次并存储在.pch文件中。使用.pch文件能够大大减少构建程序所需的时间。
? .pdb文件:该文件包含在调试模式中执行程序时要使用的调试信息。在调试模式
中,可以动态检查程序执行过程中所生成的信息。 ? .idb文件:包含重新构建解决方案时要使用的信息。 (4) 运行解决方案
在成功编译过解决方案之后,可以按下Ctrl-F5组合键来执行程序。也可以通过主菜单下的“调试”|“开始执行”,或者单击标准工具栏中的“开始调试”按钮来执行程序。之后会看到如图9所示的程序执行窗口。
图9 程序运行窗口
3. Visual C++中调试工具的使用
故障是程序中的错误,而调试就是寻找并消除故障的过程。调试是编程过程中不可缺少的组成部分,它自始至终与编程相伴。在详细描述Visual C++的调试工具之前,先来看看程序中故障的产生过程。 (1) 调试器使用简介
调试器是一个程序,它控制着程序的执行过程:程序员可以一行一行地单步调试源程序,或者运行程序中特定的位置。在源代码中每个使得调试器停下来的位置,程序员可以在继续执行之前检查乃至修改变量的值。如果修改了源代码,必须重新编译并使程序从头开始执行。
首先需要将该实例项目的编译配置设定为Win32 Debug而不是Win32 Release。编译配置为程序的编译操作选择一组项目设定值,当我们选择主菜单上的“项目”|“属性”菜单项时可以看到这些设定。当前有效的编译配置显示在标准工具栏上一堆相邻的下拉列表中。程序员还可以通过主菜单上的“生成”|“管理配置器”菜单项来设置调试配置。标准工具栏如图10所示。
图10 标准工具栏
调试工具栏如图11所示,其中“逐语句”和“逐过程“按钮代表着调试器的一种特定工作模式:单步调试代码,即每次执行一条语句,二者的区别是“逐语句”会跟踪到函数内部,对被调用的函数中的每条语句都采用单步调试方式;“逐过程”不会跟踪到函数内部,
6
每次函数调用都把函数体内的所有代码当作一条语句一次执行。当然,无论哪种单步调试方式,执行一条语句之后,程序员都必须通过检查变量的值来判断这条语句是否出现错误。
对于大型程序而言,单步调试方式显然是不切实际的。相对于单步调试方式,断点模式
逐语句 逐过程 是指执行到源代码中特定的位置(被称为断点)处暂停,所以,断点模式更节省时间,更为实用。
图11 调试工具栏
(2) 设置断点
断点是程序中使调试器自动暂停执行的位置。程序员可以设置多个断点,这样程序在运行过程中就可以在程序员选定的感兴趣的位置停止。程序员可以在执行到各个断点处查看程序中变量的值,一旦变量值不符合预订值时,就可以帮助判断程序代码中哪里出现错误,并进行修改。
通常只需要检查可能有错误的特定区域,所以,通常应该在人为包含错误的位置设置断点,然后运行程序,使程序停止在第一个断点处。然后,如果愿意,程序员可以从该断点处开始单步执行。
把源程序的某行设置为断点或者取消断点的常用方法有两种: ? 第一方法是:选择主菜单上的“调试”|“切换断点”,就可以把当前行所在的代码
设置为断点。
? 第二种方法是:在该语句行号左边的灰色显示列单击即可。
某个代码行被设置为断点之后,在该代码行左边的灰色区域中将出现一个红色的圆圈符号,它被称为图示符,表明该行存在断点。我们可以通过右击图示符的方法来删除断点。图12所示的编辑器窗格中,已经为之前的示例程序设置了一个断点。
图12 断点设置
更为高级的设置断点的方法是: ? 使用Alt-F9组合键;
? 选择主菜单上“调试”中的“窗口”|“断点”; ? 选择调试工具栏上最右边的“断点按钮。
采用上述三种方法中的任意一种,在主界面的下方将或出现如图13所示的断点窗口。其中会显示所有已经设置的断点,而短线窗口中工具栏上的“新建“按钮可以帮助设置新的断点,而“列”按钮可以帮助设置要显示的断点信息,例如显示包含断点的源文件名或函数名。
7
图13 设置断点窗口
(3) 设置跟踪点
跟踪点是一种特殊的断点,它具有与之相关联的自定义动作。创建跟踪点的方法是:右击希望设置为跟踪点的代码行,然后从弹出菜单中选择“断点”|“插入跟踪点”,这时将出现如图14所示的“命中断点时”对话框。在该对话框中可以设置跟踪点动作是“打印消息”或者运行某个宏,例如,可以在设置打印消息为:
$FUNCTION, The value of b is { b }
那么,当抵达该跟踪点时,上述设置产生的输出将显示在应用程序窗口中的输出窗格中。
当然,也可以在图14所示的命中断点时对话框中设置程序执行到跟踪点上是暂停执行还是继续执行,红色类型符号表明某行那个源代码中存在不使执行停止的跟踪点。
图14 命中断点时对话框
(4) 启动调试模式
在如图15所示的调试菜单选项上,有在4种调试模式中启动应用程序的方式。
8