|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
集成开发环境是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。简言之,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所示。
图2-9 创建新项目时指定解决方案名称 在某解决方案中添加新的项目的情形如图2-10所示。
图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>
提示 本书所附光盘中的源代码皆以解决方案组织,解决方案名对应于每章,如:ch02(第二章)。在解决方案下会放置该章对应的项目,如:stdcpp。我们在描述这些项目路径时,会说成“\ch02\stdcpp”。 2.2.2 Visual C++代码编辑器Visual C++包含了一个强大的代码编辑器,当我们创建或者打开一个.cpp文件时,代码编辑器就会被启动。在Visual C++中编辑代码的情形如图2-11所示。
图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++就会启动对应的设计界面和工具栏。
图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所示。通过这种方式,我们在程序中添加了自定义类型的资源,并通过代码完成了这些资源的加载。
图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>
提示 在本书的内容中,当我们提及某个应用程序的类型时,不再采用如上啰嗦的阐述,而是采用类似于【MFC】→【MFC 应用程序】的书写方式,望读者注意。 2.2.5 Visual C++调试器Visual C++ IDE提供了功能强大的调试器,包括联编(build)工具和调试(debug)工具,Visual C++的调试工具栏如图2-20所示,在调试状态下,其中的某些按钮才会显示。 图2-20 调试工具栏 从左到右,各按钮的含义如表2-3所示。 <DIV align=center>
如果我们发现某个程序中有bug 产生,就可以对其代码部分进行调试,以下罗列出通常采取的步骤。 在可疑的代码处添加断点。
单击工具栏中的【启动】按钮,或者按【F5】键,开始调试运行程序。
当运行至断点时,程序会暂停下来,如图2-21所示。
图2-21 通过加入进行断点调试 在暂停状态,我们可以通过打开其他功能窗口来查看程序状态,如:某个变量的值、程序调用栈的结构、寄存器的值等。这些窗口可以通过【调试】→【窗口】菜单项找到,如图2-22所示。
图2-22 调试窗口 可用的调试窗口如表2-4所示。 <DIV align=center>
通过调试工具,程序员可以及时地观察到调用栈、各内存变量的变化,从而最终找到异常的代码所在。 除调试工具外,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++的输出窗口。
图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++程序:
运行如上包含内存泄漏的程序时,可以看到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输出 宏 谷歌