一、Visual C++ 6.0概述
Visual C++6.0是微软公司推出的目前使用极为广泛的基于Windows平台的可视化集成开发环境,它和Visual Basic、Visual Foxpro、Visual J++等其它软件构成了Visual Studio(又名Developer Studio)程序设计软件包。Developer Studio是一个通用的应用程序集成开发环境,包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用Visual Studio,可以完成创建、调试、修改应用程序等的各种操作。
VC++6.0提供面向对象技术的支持,它能够帮助使用MFC库的用户自动生成一个具有图形界面的应用程序框架。用户只需在该框架的适当部分添加、扩充代码就可以得到一个满意的应用程序。
VC++6.0除了包含文本编辑器,C/C++混合编译器,连接器和调试器外,还提供了功能强大的资源编辑器和图形编辑器,利用“所见即所得”的方式完成程序界面的设计,大大减轻程序设计的劳动强度,提高程序设计的效率。
VC++的功能强大,用途广泛,不仅可以编写普通的应用程序,还能很好地进行系统软件设计及通信软件的开发。
二、使用Visual C++ 6.0建立C语言应用程序
利用VC++6.0提供的一种控制台操作方式,可以建立C语言应用程序, Win32控制台程序(Win32 Console Application)是一类Windows程序,它不使用复杂的图形用户界面,程序与用户交互是通过一个标准的正文窗口,下面我们将对使用Visual C++ 6.0编写简单的C语言应用程序作一个初步的介绍。
1.安装和启动
运行Visual Studio软件中的setup.exe程序,选择安装Visual C++ 6.0,然后按照安装程序的指导完成安装过程。
安装完成后,在开始菜单的程序选单中有Microsoft Visual Studio 6.0图标,选择其中的Microsoft Visual C++ 6.0即可运行(也可在Window桌面上建立一个快捷方式,以后双击即可运行)。
2.创建工程项目
用Visual C++6.0系统建立C语言应用程序,首先要创建一个工程项目(project),用来存放C程序的所有信息。创建一个工程项目的操作步骤如下:
(1)进入Visual C++6.0环境后,选择主菜单“文件(File)”中的“新建(New)”选项,在弹出的对话框中单击上方的选项卡“工程(Projects)”,选择“Win32 Console Application”工程类型,在“工程(Project name)”一栏中填写工程名,例如Myexam1,在“位置(Location)”一栏中填写工程路径(目录)例如:D:\\ MyProject,见图2-1,然后单击“确定(OK)”按钮继续。
1
图2-1 创建工程项目
(2)屏幕上出现如图2-2所示的“Win32 Console Application—Step 1 of 1”对话框后,选择“An empty project”项,然后单击“F完成(Finish)”按钮继续:
图2-2 Win32 Console Application—Step 1 of 1对话框
出现如图2-3所示的“新建工程信息(New Project Information)”对话框后,单击“确定(OK)”按钮完成工程创建。创建的工作区文件为myexam1.dsw和工
2
程项目文件myexam1.dsp。
图2-3 新建工程信息对话框
3. 新建C源程序文件
选择主菜单“工程(Project)”中的“添加工程(Add to Project)新建(New)”选项,为工程添加新的C源文件。
图2-4 加入新的C源程序文件
出现如图2-4所示的“新建”对话框后,选择“文件(File)”选项卡,选定“C++ Source File”项,在“文件(File Name)”栏填入新添加的源文件名,如myexam1.c,“C目录:(Location)”一栏指定文件路径,单击“确定(OK)”按钮完成C源程序的系统新建操作,如图2-4所示。
在文件编辑区输入源程序,然后保存工作区文件,如图2-5所示。
注意:填入C源文件名一定要加上扩展名“.c”,否则系统会为文件添加默认的C++源文件扩展名“.CPP”。
3
图2-5 建立c源程序
4.打开已存在的工程项目,编辑C源程序
进入Visual C++6.0环境后,选择主菜单“打开工作区(Open Workspace)”命令,在“Open Workspace”对话框内找到并选择要打开的工作区文件myexam1.dsw,单击“确定(OK)”按钮,打开工作区。
图2-6 打开myexam1.c源程序
在左侧的工作区窗口,单击下方的 “FileView” 选项卡,选择文件视图显示,打开“Source”文件夹,再打开要编辑的C源程序进行编辑和修改。如图2-6所示。
5.在工程项目中添加已经存在的C
4
源程序文件
选择主菜单“打开工作区(Open Workspace)”命令,在“Open Workspace”
对话框内找到并选择要打开的工作区文件“myexam.dsw”,单击“确定(OK)”按钮打开工作区。
将已经存在的C源程序文件添加工程到当前打开的工程区文件中,选择主菜单“工程(Project)”中的“添加工程(Add to Project) File”选项,在“Insert File into Project”对话框内找到已经存在的C源程序文件,单击“确定(OK)”按钮完成添加。
6.编译、连接和运行
(1)编译
选择主菜单“编译(Build)”中的“编译(Compile)”命令,或单击工具条上的图标,系统只编译当前文件而不调用链接器或其它工具。输出(Output)窗口将显示编译过程中检查出的错误或警告信息,在错误信息处单击鼠标右键或双击鼠标左键,可以使输入焦点跳转到引起错误的源代码处大致位置以进行修改。如图2-7所示,输出窗口中提示“Error C2146: syntax error : missing ';' before identifier 'sum2'”,提示在标识符sum2之前缺少分号,同时在程序窗口标注出出错语句的大致位置。在“sum1=b-a”语句的后面加一个分号后再编译一次即可。
(2)构建
选择主菜单“编译(Build)”中的“构建(Build)”命令,或单击工具条上的图标对最后修改过的源文件进行编译和连接。
选择主菜单“编译(Build)”中的“重建全部(Rebuild All)”命令,允许用户编译所有的源文件,而不管它们何时曾经被修改过。
选择主菜单“编译(Build)”中的“批构建(Batch Build)”命令,能单步重新建立多个工程文件,并允许用户指定要建立的项目类型。
程序构建完成后生成的目标文件(.obj),可执行文件(exe)存放在当前工程项目所在文件夹的“Debug” 子文件夹中。
,
5
图2-7 编译、连接和运行.C源程序
(3)运行
选择主菜单“编译(Build)”中的“执行(Build Execute)”命令,或单击工具条上的图标
,执行程序,将会出现一个新的用户窗口,按照程序输入要求正确输入数据
后,程序即正确执行,用户窗口显示运行的结果。
对于比较简单的程序,可以直接选择该项命令,编译、连接和运行一次完成。
7.调试程序
在编写较长的程序时,能够一次成功而不含有任何错误决非易事,对于程序中的错误,系统提供了易用且有效的调试手段。调试是一个程序员最基本的技能,不会调试的程序员就意味着即使学会了一门语言,却不能编制出任何好的软件。
(1)调试程序环境介绍
① 进入调试程序环境
选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令,选择下一级提供的调试命令,或者在菜单区空白处单击鼠标右键,在弹出的菜单中选中“调试(Debug)”项。激活调试工具条,选择需要的调试命令,系统将会进入调试程序界面。同时提供多种窗口监视程序运行,通过单击“调试(Debug)”工具条上的按钮,可以打开/关闭这些窗口,参考图2-8。
② Watch(观察)窗口
单击调试(Debug)工具条上的Watch按钮,就出现一个Watch窗口, 系统支持查看程序运行到当前指令语句时变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。
观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。
还可以采用系统提供一种被称为Watch的机制来观看变量和表达式的值。在断点中断状态下,在变量上单击右键,选择Quick Watch, 就弹出一个对话框,显示这个变量的值。
在该窗口中输入变量或者表达式,就可以观察变量或者表达式的值。注意:这个表达式不能有副作用,例如“++”和“- -”运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致程序的逻辑被破坏。
③ Variables(变量)窗口
单击调试(Debug)工具条上的“Variables“按钮弹出Variables窗口,显示所有当前执行上下文中可见的变量的值。特别是当前指令语句涉及的变量,以红色显示。
④ Memory(内存) 由于指针指向的数组,Watch窗口只能显示第一个元素的值。为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。单击调试(Debug)工具条上的“memory“按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。
⑤ Registers(寄存器)
单击调试(Debug)工具条上的“Registers”按钮弹出一个对话框,显示当前的所有寄存器的值。
6
⑥ Call Stack(调用堆栈)
调用堆栈反映了当前断点处函数是被哪些函数按照什么顺序调用的。单击调试(Debug)工具条上的.“Call stack”显示Call Stack对话框。在Call Stack对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。.
图2-8 调试程序界面
(2) 单步执行调试程序
系统提供了多种单步执行调试程序的方法:可以通过单击调试(Debug)工具条上的按钮或按快捷键的方式选择多种单步执行命令。
① 单步跟踪进入子函数(Step Into,F11),每按一次F11键或按
,程序执行一
条无法再进行分解的程序行,如果涉及到子函数,进入子函数内部; ② 单步跟踪跳过子函数(Step Over,F10),每按一次F10键,程序执行一行;Watch窗口可以显示变量名及其当前值,在单步执行的过程中,可以在Watch窗口中加入所需观察的变量,辅助加以进行监视,随时了解变量当前的情况,如果涉及到子函数,不进入子函数内部;
③ 单步跟踪跳出子函数(Step Out,Shift+F11),按键后,程序运行至当前函数的末尾,然后从当前子函数跳到上一级主调函数。
④ 运行到当前光标处
当按下CTRL+F10后。程序运行至当前光标处所在的语句。 表2-1 常用调试命令一览表 菜单 命令 Go Step Over Step Into Run to Cursor
工具条按钮 快捷键 说 明 继续运行,直到断点处中断。 单步,如果涉及到子函数,不进入子函数内部 F5 F10 单步,如果涉及到子函数,进入子函数内部 F11 CTRL+F10 运行到当前光标处。 7
Step Out Stop Debugging
Shift +F11 F9 Shift+F5 运行至当前函数的末尾。跳到上一级主调函数 设置/取消 断点 结束程序调试,返回程序编辑环境
图2-9 设置断点调试程序
(3)设置断点调试程序
为方便较大规模程序的跟踪,断点是最常用的技巧。断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。参考图2-9。
① 设置断点的方法
可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后按F9快捷键或者单击“编译”工具条上的按钮 一个红色圆点。参考图2-9和表2-1。
还可以选择主菜单“编辑(Edit)”中的“断点(Breakpoints)”命令,弹出“Breakpoints”对话框,打开后点击“A分隔符在 (Break at)”编辑框的右侧的箭头,选择合适的位置信息。一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。
系统提供如下多种类型的断点:
条件断点:可以为断点设置一个条件,这样的断点称为条件断点。对于新加的断点,可以单击“C条件(Conditions)”按钮,为断点设置一个表达式。当这个表达式发生改变时,程序就被中断。
8
,断点处所在的程序行的左侧会出现
数据断点:数据断点只能在“Breakpoints”对话框中设置。选择“Data”选项卡,显示设置数据断点的对话框。在编辑框中输入一个表达式,当这个表达式的值发生变化时,到达数据断点。一般情况下,这个表达式应该由运算符和全局变量构成。
消息断点:VC也支持对Windows消息进行截获。有两种方式进行截获:即窗口消息处理函数和特定消息中断。在“Breakpoints”对话框中选择Messages选项卡,就可以设置消息断点。
② 程序运行到断点
选择主菜单“编译(Build)”中的“开始调试(Start Debug)”命令的下一级的“去(Go)”调试命令,或者单击“编译(Compile)”工具条上的 按钮,程序执行到第一个断点处程序将暂停执行,该断点处所在的程序行的左侧红色圆点上添加一个黄色箭头,此时,用户可方便地进行变量观察。继续执行该命令,程序运行到下一个相邻的断点。参考图2-9。
③ 取消断点
只需在代码处再次按F9或者单击“编译”工具条上的按钮 “Breakpoints”对话框后,按照界面提示去掉断点。
(4) 结束程序调试,返回程序编辑环境。
选择主菜单“Debug”中的“Stop Debugging”命令,或者单击“调试(Debug)”工具条上的
按钮,或者单击Shift+F5键,可结束程序调试,返回程序编辑环境。
。也可以打开
8.有关联机帮助
Visual C++6.0提供了详细的帮助信息,用户通过选择“帮助(Help)”菜单下的“帮助目录(Contents)”命令就可以进入帮助系统。在源文件编辑器中把光标定位在一个需要查询的单词处,然后按F1键也可以进入Visual C++6.0的帮助系统。用户要使用帮助必须首先安装MSDN。用户通过Visual C++6.0的帮助系统可以获得几乎所有的Visual C++6.0的技术信息,这也是Visual C++作为一个非常友好的开发环境所具有的特色之一。
三、Visual C++ 6.0工程中的项目文件都表示什么
.opt:工程关于开发化境的参数文件,如工具条位置等信息。
.aps(AppStudio File):资源辅助文件,二进制格式,一般不用去管他。
.clw:ClassWizard信息文件,实际上是INI文件格式,又兴趣可以研究一下。有时候ClassWizard出了问题,手工修改CLW文件可以解决。如果此文件不存在的话,每次用ClassWizard的时候会提示是否重建。
.dsp(DevelopStudio Project):项目文件,文本格式,不过不熟悉的不要手工修改。 .dsw(DevelopStudio Workspace):是工作区文件,其他特点和.dsp差不多。
.plg:是编译信息文件,编译时的error和warning信息文件(实际上时一个html文件),一般用处不大。在单击菜单【Tool】->【Option】弹出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project):是生成帮助文件的工程,用microsoft Help Compiler可以处理。 .mdp(Microsoft DevStudio Project):是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的.dsp格式。
9
.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须用这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,这样可以加快编译速度。
.map:是执行文件的影像信息记录文件,除非对系统底层,这个文件一般用不着。 .pch(Pre-Compiled File):可以加快编译速度,但是文件非常大。
.pdb(Program Database):记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
.exp:只有在编译DLL的时候才会生成,记录了DLL文件的一些信息,一般也没有用。 .ncb:无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件,编译工程后会自动生成。
四、VC++6.0编译出错调试方法
《1》在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive的错误. 解决方法:
1、 如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。确定。 2、在文件开头添加: #include \"stdafx.h\"
对预编译头文件说明如下:
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include \"stdafx.h\"前的代码都是预编译的,它跳过#include \"stdafx. h\"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的CPP实现文件第一条语句都是:#include \"stdafx.h\"。
《2》在编译VC++6.0是,出现one or more multiply defined symbols found 的错误. 一般还伴随着_XXx already defined in XXX.obj 的错误,也就是说链接时出现一个函数定义了两次了。 解决办法:
不知道你是什么问题按以下步骤 重建双击vc打开新建 工程 选win32 Application加入文件名 默认项 完成新建 C++ Source File源文件 输入文件名完成粘贴你的代码插入下面一行wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); 看看能不能编译通过 运行出来了 当然也如果是一段程序的话,可以不新建工程也不加入任何工程,一般不会出现这种问题 《3》Local function definitions are illegal错误 这个没有别的原因就是少了一个右大括号“}”,报错的个数和这个函数的位置有关,好像也
10
和作用域有关,或者和它的使用频度有关,反正报错的个数不太一样,是主应用程序的一个函数少了一个“}”。解决的方法就是:如果函数的数量少就一个一个的用Ctrl+}来查,如果太多的话就的将最近改动过的来试,好像也没有什么好的方法。(一般报错的位置不是真正的出错位置,一般是报错位置的上一个函数)
Syntax error:missing ';'before'}' missing function header(old-style formal list?)这样的错误提示肯定是少了一个左大括号“{”,这种情况下报错的数目不会太多,一般也就是四个Syntax error:missing ';'before'}' ,一个missing function header(old-style formal list?),这时候注意你查你这个函数的左大括号就可以了,当时这时的报错的行一般都不是真正出问题的地方,而是在这个的上面的某个函数少了一个左大括号。
这是整个函数的大括号的问题,如果是函数内部少大括号的问题的话就不会报这么多错了,也比较好改。
《4》多次用getchar()函数时有些代码不执行问题
这个问题很隐蔽,因为每次用键盘输入时会代入一个回车,这样第一个getchar得到想要的值,第二个会得到一个回车。解决方法是如果可以的话让getchar成对出现,第二个什么也不做。
《5》fatal error C1083: Cannot open precompiled header file: 'Debug/v13_3.pch': No such file or directory
在网上搜集了一下,这个错误是预编译文件的设置造成的,有几种可以尝试的途径: 1)单独编译StdAfx.cpp 2)编译所有(即按Ctrl+F7)
3)在工程-设置-c++-最下面的工程选项里去掉××。pch文件
4)在工程-设置-c++-在分类里选择预编译头文件,选择自动使用预补偿页眉,或者选择不使用预补偿头
五、值得注意的几点:
1、如何设置断点
按F9在当前光标处增加一个断点和取消一个断点。
另外,在编辑状态下,按Ctrl+B组合键,弹出断点设置对话框。然后单击【Condition…】按钮弹出设置断点条件的对话框进行设置。 2、如何清除所有的断点
菜单【Edit】->【Breakpoints…】,打开“Breakpoints”对话框,单击【Remove All】按钮即可。
快捷键是“Ctrl + Shift + F8”。
3、如何检测程序中的括号是否匹配
把光标移动到需要检测的括号前面,按快捷键“Ctrl + ]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。
4、几个重要的快捷键:
F9在当前光标所在的行下断点,如果当前行已经有断点,则取消断点. F5调试状态运行程序,程序执行到有断点的地方会停下来. F10单步执行程序.
CTRL+F10运行到光标所在行.
11
F11和F10的区别是,如果当前执行语句是函数调用,则会进入函数里面. SHIFT+F11跳出当前所在函数.
特别说明:
a.有的地方不能下断点.比如空行,基本类型定义语句(不初始化),等等非执行语句.比如 int i; // 此行不能下断点 int j=0;// 这里可以下 CStringstr;// 这里可以下
intk = Max(i,j);// 这里可以下
b.不是所有断点都会(断).比如下断点的语句在程序里面没有被执行.
c.此外,ALT+F9还可以下条件断点,不过这个不常用,有兴趣的可以自己研究:)
12
因篇幅问题不能全部显示,请点此查看更多更全内容