熟悉Visual C++ IDE

来源:互联网 发布:linux 守护进程 编辑:程序博客网 时间:2024/05/16 12:48


第2章 关于Visual C++的话题

2.2 熟悉Visual C++ IDE
   

集成开发环境是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。简言之,IDE就是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套件。

Visual C++ IDE实际上是Visual Studio集成开发环境的一部分,Visual Studio 2005所包含的成员如图2-7所示,可以看出,除了Visual C++,它还包含Visual Basic、C#,我们使用Visual C++进行编程的一些操作,当我们转换到C#或者Visual Basic语言的时候,其操作基本上是一致的。

图2-7  Visual Studio集成开发环境

2.2.1  文件、项目与解决方案

在最原始的时代,我们使用C++编译器来编译每个文件,并通过命令行程序将它们手动地连接起来。这些源文件主要包括.h和.cpp文件。

在Visual C++中,项目(project,又译做工程)的概念被提出,它会包含一系列的源文件、静态库,以及项目的配置信息。在 Windows环境下,人们还需要用到一系列的资源,如:图标、工具栏、菜单等,这些资源也被纳入了项目之中,这种概念如图2-8所示。

图2-8  Visual C++项目的含义

比项目更大的概念是解决方案(solution),解决方案包含一组项目。如:当我们开发某个网络项目时,它可能包括服务器端和客户端,那么这个时候将服务器端和客户端两个项目XXXServer、XXXClient纳入一个XXX解决方案中是合适的。

当我们创建新项目的时候,Visual C++总是要求我们输入解决方案的名称,默认情况下,解决方案的名称与项目的名称一样,新建项目的情形如图2-9所示。

<DIV>

解决方案的名称

ch15

</DIV><DIV>

项目的名称

CInt

</DIV>

图2-9  创建新项目时指定解决方案名称

在某解决方案中添加新的项目的情形如图2-10所示。

<DIV>

解决方案

 

</DIV><DIV>

新建项目

 

</DIV><DIV>

多个项目列表

 

</DIV>

图2-10  在解决方案中添加项目

Visual C++项目的目录结构是很清晰的,不同的项目具有的目录结构是大致相同的。对于某个项目PPP,Visual C++会为它准备以下几个目录。

l        SSS:解决方案的存放目录,一个解决方案可包含多个项目。

l        SSS \PPP:存放PPP项目的源文件和其他信息。

l        SSS \PPP\Res:存放PPP项目的资源文件。

l        SSS \Debug:存放SSS下各项目的调试版本程序的输出文件。

l        SSS \Release:存放SSS下各项目的发布版本程序的输出文件。

在项目目录下,会存在着不同类型的文件,这些文件可能具有的后缀名及其含义如表2-1所示。

<DIV align=center>

表2-1  Visual C++常见文件类型

后缀名

含义

APS

资源视图(Resource View)信息文件

BSC

浏览器信息文件

IDL

接口定义语言文件

NCB

Class View信息文件

SLN

解决方案文件

SUO

包含解决方案中的可选项和配置信息

VCPROJ

项目文件

RC

描述了项目的菜单、对话框、字符串和快捷键资源

</DIV>

提示

本书所附光盘中的源代码皆以解决方案组织,解决方案名对应于每章,如:ch02(第二章)。在解决方案下会放置该章对应的项目,如:stdcpp。我们在描述这些项目路径时,会说成“\ch02\stdcpp”。

2.2.2  Visual C++代码编辑器

Visual C++包含了一个强大的代码编辑器,当我们创建或者打开一个.cpp文件时,代码编辑器就会被启动。在Visual C++中编辑代码的情形如图2-11所示。

<DIV>

动态语法着色

 

</DIV>

图2-11  代码编辑器

代码编辑器可能是那些自诩为“真正的程序员”(包括笔者在内)最为亲切的界面。Visual C++代码编辑器的“强大”体现在以下几点。

l        动态语法着色:在代码编辑器中,诸如for、return这些关键词会自动着色,此外,注释、数字、字符串也会显示成不同的颜色。

l        代码自动缩进:代码自动缩进的含义在于,一旦你编写了“if”或者“{”,当你按回车键时,下一行的代码将会自动缩进。

l        智能提示:智能提示是Visual C++提供的最有用的功能之一,如果没有该功能,程序员就必须花费很多的时间去记忆太多的类名、函数名及它们的原型定义等,而且一旦在编码过程中发生了任何拼写错误,都会带来恼人的编译错误。智能提示有效避免了该错误的发生,它会下拉显示当前可用的标识符,在函数调用语句的编写中,会自动显示函数的参数及其类型,如图2-12所示。

图2-12  智能提示

l        代码格式化:“代码格式化”的功能可以在主菜单【编辑】→【高级】下找到,如图2-13所示。一旦使用了“代码格式化”,选定的代码段会自动进行缩进,从而大大提高程序的美观性。

图2-13  代码格式化菜单

l        代码热点链接:如图2-14所示,我们可以跳转到某个标识符(对象名、类名、函数等)所在的头文件,这个特性有点类似于“超级链接”。

图2-14  代码热点链接

2.2.3  Visual C++资源编辑器

大家知道,编写Windows程序时,程序中用到的菜单、图标、位图、字符串可以存储在资源中。Visual C++由此提供了资源编辑器,帮助我们很方便地进行资源地设计。

在项目开发过程中,一旦我们切换到【资源】视图,会看到该项目中的各种资源,如图2-15所示。一旦我们打开某个资源,Visual C++就会启动对应的设计界面和工具栏。

<DIV>

资源视图

 

</DIV><DIV>

对话框的编辑界面

 

</DIV><DIV>

项目中的资源列表

 

</DIV><DIV>

资源编辑的工具栏

 

</DIV>

图2-15  资源编辑器

我们也可以向项目中添加新的资源,我们可以添加的资源种类如图2-16所示: Accerlerator(快捷键)、Bitmap(位图)、光标(Cursor)、Dialog(对话框)、HTML页面、Icon(图标),Menu(菜单)以及String Table(字符串表),Tool Bar(工具栏)以及Version(程序的版本信息)。

除了这些资源类型之外,我们也可以通过【导入】创建新的资源,并为之指定一个资源的类型名。单击【导入】按钮,在【导入】窗口中选择某个文件,如:“colors.dict”,Visual C++会弹出窗口询问资源类型,如图2-17所示。

            

图2-16  添加资源                                      图2-17  导入其他类型的资源

我们输入“DICT”之后,可以发现在资源列表中自动添加了“DICT”类型的资源IDR_DICT1,如图2-18所示。通过这种方式,我们在程序中添加了自定义类型的资源,并通过代码完成了这些资源的加载。

<DIV>

新的资源类型“DICT”

 

</DIV>

图2-18  导入的资源

2.2.4  Visual C++应用向导

使用Visual C++应用向导可以创建指定类型的项目。一旦我们选择了新建一个项目,Visual C++总会弹出一个对话框让我们选择项目的类型,如图2-19所示。当我们选择了某个类型,如:“MFC”,右侧视图会列出相应的子类型(模板),如:“MFC ActiveX 控件”、“MFC DLL”和“MFC 应用程序”。如果我们希望制作一个EXE应用程序,则可以考虑选择“MFC 应用程序”。

图2-19  选择项目类型

当然,一旦我们选择了“MFC 应用程序”,接下来应用向导会引导我们做出更多的选择,根据这些向导,程序员可以通过简单的选择操作完成项目框架的构造。常见的Visual C++项目类型如表2-2所示。

<DIV align=center>

表2-2  常见Visual C++项目类型

项目类型

子类型

ATL

ATL项目

CLR

类库、CLR控制台应用程序、CLR空项目、Windows 窗体应用程序、Windows 窗体控件库、Windows服务

MFC

MFC ActiveX控件、MFC DLL、MFC应用程序

Win32

Win32 控制台应用程序、Win32 项目

</DIV>

提示

在本书的内容中,当我们提及某个应用程序的类型时,不再采用如上啰嗦的阐述,而是采用类似于【MFC】→【MFC 应用程序】的书写方式,望读者注意。

2.2.5  Visual C++调试器

Visual C++ IDE提供了功能强大的调试器,包括联编(build)工具和调试(debug)工具,Visual C++的调试工具栏如图2-20所示,在调试状态下,其中的某些按钮才会显示。

图2-20  调试工具栏

从左到右,各按钮的含义如表2-3所示。

<DIV align=center>

表2-3  调试工具按钮

图标

名称

含义

启动调试

开始程序的运行

全部中断

中断程序的运行

停止调试

停止当前程序的运行

重新启动

重新来过

显示下一语句

显示下一条语句

逐语句

进入当前调用的函数体,对应于快捷键【F11】

逐过程

单步执行,对应于快捷键【F10】

跳出

跳出当前调用的函数,对应于快捷键【Shift+F11】

十六进制显示

以十六进制显示变量值

在源中显示线程

 

调试窗口

打开调试窗口(包括断点、输出、即时窗口)

</DIV>

如果我们发现某个程序中有bug 产生,就可以对其代码部分进行调试,以下罗列出通常采取的步骤。

在可疑的代码处添加断点。

 

 

单击工具栏中的【启动】按钮,或者按【F5】键,开始调试运行程序。

 

当运行至断点时,程序会暂停下来,如图2-21所示。

 

<DIV>

程序会停在断点位置

 

</DIV>

图2-21  通过加入进行断点调试

在暂停状态,我们可以通过打开其他功能窗口来查看程序状态,如:某个变量的值、程序调用栈的结构、寄存器的值等。这些窗口可以通过【调试】→【窗口】菜单项找到,如图2-22所示。

<DIV>

调试窗口

</DIV>

图2-22  调试窗口

可用的调试窗口如表2-4所示。

<DIV align=center>

表2-4  调试窗口菜单项

图标

名称

含义

断点

查看所有断点

输出

查看程序的调试输出信息

 

监视

用以查看指定表达式的值

自动窗口

显示当前模块的自动变量

局部变量

显示当前模块的局部变量

即时

即时根据用户的输入/输出表达式的值

调用堆栈

显示函数调用的栈结构

线程

显示当前的线程信息

模块

显示当前的模块信息

进程

显示当前的进程信息

 

内存

查看内存中的值

反汇编

查看汇编代码

寄存器

显示各寄存器的值

</DIV>

通过调试工具,程序员可以及时地观察到调用栈、各内存变量的变化,从而最终找到异常的代码所在。

除调试工具外,Visual C++还提供了两个很有用的宏函数:TRACE()和ASSERT(),它们常常配合调试使用。TRACE的函数原型为:

TRACE(exp )

TRACE(DWORD category, UINT level, LPCSTR lpszFormat, ... )

ATLTRACE2( exp );

ATLTRACE2(

   DWORD category,

   UINT level,

   LPCSTR lpszFormat,

   ...

);

TRACE()的效果如图2-23所示。可以看到,TRACE()和printf()的使用方式一样。只不过它的输出不是标准输出设备,而是Visual C++的输出窗口。

<DIV>

TRACE()语句输出调试信息至输出窗口

 

</DIV><DIV>

TRACE()语句

 

</DIV>

图2-23  使用TRACE()输出调试信息

断言ASSERT用于检查一些“不应该”发生的情况。ASSERT的函数原型如下:

ASSERT(

      booleanExpression

)

ASSERT的含义就是“条件booleanExpression必须得满足”(即条件bExpression为true),如:

int a = 3, b = 4;

int c = a + b;

ASSERT(c == 7);

“条件booleanExpression一定得满足”,那么,“不满足”会怎么样?当ASSERT 断言的条件bExpression为false的时候,Visual C++将会给出红色的警告,如图2-24所示。

图2-24  ASSERT窗口

此时,我们可以单击【终止】按钮以终止该程序;单击【忽略】按钮以继续执行后面的语句;如果要跟踪进去查看错误源,则单击【重试】按钮,这样的话程序将会转至发生ASSERT错误的代码行,并暂停程序执行。

提示

TRACE()和ASSERT()宏只有在调试版本(即_DEBUG宏被定义)时才能奏效。对于Release版本,TRACE()和ASSERT()宏没有任何作用。

此外,Visual C++调试器提供了对内存泄漏的检测功能,考察如下一段包含内存泄漏的C++程序:

【程序 2‑2】一段包含内存泄漏的程序

 

01            #include "stdafx.h"

02           

<DIV>

new出来的对象没有析构

 

</DIV> 

03            int main()

04            {

05               int * ip = new int;

06               return 0;

07            }

运行如上包含内存泄漏的程序时,可以看到Visual C++的输出窗口产生如下内容,如图2-25所示。

图2-25  Visual C++中内嵌的内存泄漏检测

其明确地输出内存泄漏的信息:

Detected memory leaks!

Dumping objects ->

{80} normal block at 0x003E2A20, 4 bytes long.

 Data: <    > CD CD CD CD

Object dump complete.

光盘导读

该项目对应于光盘中的目录“\ch02\MemleakTest”。

虽然通过调试窗口,我们可以很明显地看到内存泄漏的所在(一个new出来的整形变量所占用的4个字节没有释放),但是针对稍微庞大一点的项目而言,如上的这种信息似乎也只能起到提醒的作用,程序员很难定位到程序的出错点。这就需要更高的内存处理和调试技巧,第3.5节“智能指针(smart pointer)”将会介绍如何采用智能指针避免程序中的内存泄漏问题。

MSDN参考

欲在MSDN中查看相关信息,可使用关键字:“MFC,内存管理”。





参考:

把脉VC++ [ 华初网推荐 ]

virtual C++ IDE输出 宏 谷歌

0 0