Visual Studio入门
一、目的和要求
1.熟悉Visual Studio集成开发环境
2.学会使用VS编辑、编译、链接和运行C++程序的方法
3.初步了解C++程序的结构
二、具体内容
(一)创建控制台应用
在你打开 Visual Studio 后,可查看 IDE 的三个基本部分:工具窗口、菜单和工具栏,以及主窗口空间。 工具窗口位于应用窗口的左右两侧。 “快速启动”框、菜单栏和标准工具栏位于顶部。 窗口的中部包含“起始页”。 当你打开解决方案或项目时,将在这里显示编辑器和设计器。 开发应用时,大部分时间都花在此中心区域。
Visual Studio 使用项目来组织应用的代码,使用解决方案来组织项目。 项目包含用于生成应用的所有选项、配置和规则。 它还负责管理所有项目文件和任何外部文件间的关系。 若要创建应用,先创建一个新项目和解决方案。
(二)创建控制台应用项目
1.在菜单栏上,依次选择“文件”>“新建”>“项目”,打开“新建项目”对话框。
2.如果尚未选中,则在“新建项目”对话框中,选择“已安装”>“Visual C++”。 在中间窗格中,选择“Windows 控制台应用程序”模板。 在“名称”编辑框中,输入“HelloApp”。
对话框可能有不同的选择,具体取决于安装的 Visual Studio 工作负载和组件。 如果看不到 Visual C++ 项目模板,则需再次运行 Visual Studio 安装程序并安装“使用 C++ 的桌面开发”工作负载。 可直接从“新建项目”对话框操作。 若要启动安装程序,请选择对话框上的“打开 Visual Studio 安装程序”链接。
3.选择“确定”按钮,创建应用项目和解决方案。
随后将创建 HelloApp 项目和解决方案及 Windows 控制台应用的基本文件,并自动将其加载到“解决方案资源管理器”中。 代码编辑器中会打开 HelloApp.cpp 文件。 “解决方案资源管理器”中会显示这些项:
(三)向应用添加代码
接下来,添加代码以在控制台窗口中显示单词“Hello”。
在编辑器中编辑代码
1.在 HelloApp.cpp 文件中,在行 return 0; 之前输入一个空行,然后输入此代码:
cout << "Hello\n";
红色的波浪线显示在 cout下面。 如果将指针悬停在其上方,则会显示错误消息。
错误消息也将出现在“错误列表” 窗口中。 可在菜单栏中选择“视图”>“错误列表”来显示此窗口。
代码缺少 std::cout 声明,可在 标头文件中找到该声明。
2.若要添加 iostream 标头,请在 #include “stdafx.h” 后输入此代码:
#include <iostream>
using namespace std;
修复该错误后, cout 下面的红色波浪线将消失。
3.若要保存对文件所做的更改,请按 Ctrl+S。
(四)生成应用
生成代码十分简单。 在菜单栏上,依次选择“生成”>“生成解决方案”。 Visual Studio 生成 HelloApp 解决方案,并在“输出”窗口中报告进度。
(五)调试和测试应用
可调试 HelloApp,查看控制台窗口中是否显示单词“Hello”。
1.若要调试应用程序
若要启用调试器,请选择菜单栏上的“调试”>“开始调试”。
调试器启动并运行代码。 在调试器停止运行时,控制台窗口(类似命令提示符的单独窗口)将显示几秒钟,但是将很快关闭。 若要查看文本,你需要设置一个断点以停止程序执行。
2.要添加一个断点
1)在编辑器中,将光标置于行 return 0; 上。 在菜单栏上,选择“调试”>“切换断点”。 还可单击左侧边距处来设置断点。
编辑器窗口最左侧边距中该代码行附近将显示一个红圈。
2)若要启用调试,请按 F5。
调试器启动,控制台窗口出现并显示单词 Hello。
3)若要停止调试,请按 Shift+F5。
(六)生成应用程序的发布版本
确认一切就绪后,可以准备该应用程序的发布版本。 发布版本省去了调试信息,且使用编译器优化选项来创建更小、更快的代码。
要清理解决方案文件并生成发布版本:
1)在菜单栏上,依次选择“生成”>“清理解决方案”,删除上一生成过程中创建的中间文件和输出文件。
2)若要将 HelloApp 的解决方案配置从“调试”更改为“发布”,请在工具栏中选择“解决方案配置”控件上的下拉菜单,然后选择“发布”。
3)生成解决方案。 在菜单栏上,依次选择“生成”>“生成解决方案”。
三、备注说明
(一) 关于头文件 #include
C语言的头文件都是带有“.h”扩展名的,C++中也有带.h的头文件,是为了兼容C所延续的风格。在新的C++标准库,C中的每一个头文件都有一个不带.h的相对应,例如stdlib.h对应于cstdlib,iostream.h对应于iostream。这里要注意,C++标准库中的头文件的内容都是放在叫“std”的命名空间。为了避免函数名冲突,尽量不要混合使用这两者,建议统一使用C++风格头文件。
(二) 关于main()函数
C++标准的main()函数是下面两种形式:
int main( )
int main(int argc, char** argv)或者int main(int argc, char* argv[])
C++中 int main()与int main(void)等价,都表示无参数。但是C语言中,这两个不是同一个意思,int main( )表示任意参数,int main(void)表示五参数。这个问题不仅局限于main函数,其它自定义函数都是同样的规定。
(三) using namespace std;
这句表示的是导入命名空间std中所有的类和方法,这会导致文件很大,但对于一些很小的程序,问题不大。不过实际应用中一般不建议这样做。通常做法是需要什么函数就单独导入相应的函数。
例如:
using std::cout;
或者所有函数加上命名空间标识符
std::cout << “hello” << std::endl;
(四) C/C++编译过程
C/C++编译过程主要分为4个过程
(1)编译预处理
(2)编译、优化阶段
(3)汇编过程
(4)链接程序
1.预编译过程
(1)宏定义指令,如#define Name TokenString,#undef等。 对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的 Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。 这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。 预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
(3) 头文件包含指令,如#include "FileName"或者#include 等。 在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。 包含到C源程序中的头文件可以是系统提供的,在程序中#include它们要使用尖括号(< >)。
(4)另外开发人员也可以定义自己的头文件,这些文件一般与C源程序放在同一目录下,此时在#include中要用双引号("")。
(5)预处理模块 预处理工作由#pragma命令完成,#Pragma命令将设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
2.编译、优化阶段
首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,把代码翻译成汇编语言。
3.汇编程序
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
目标文件由段组成。通常一个目标文件中至少有两个段:
代码段:该段中所包含的主要是程序的指令。 该段一般是可读和可执行的,但一般却不可写。
数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读、可写、可执行的。
4.链接程序
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。 链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。
这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
2)动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
C/C++编译过程对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
上一篇: OK6410 LCD驱动移植
下一篇: 在VS中创建和使用动态库