VS使用方法笔记.docx
- 文档编号:23716890
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:31
- 大小:620.04KB
VS使用方法笔记.docx
《VS使用方法笔记.docx》由会员分享,可在线阅读,更多相关《VS使用方法笔记.docx(31页珍藏版)》请在冰豆网上搜索。
VS使用方法笔记
VS2010使用
VC2010里面不能单独编译一个.cpp或者一个.c文件,这些文件必须依赖于某一个项目,因此我们必须创建一个项目。
有很多种方法都可以创建项目,可以通过菜单:
文件,新建,项目;也可以通过工具栏点击新建项目进行创建。
这里我们点击起始页面上面的新建项目:
1、vs2010中有哪些文件类型,都有什么作用?
.h头文件,声明部分。
头文件的作用就是被其他的.cpp包含进去的。
它们本身并不参与编译,但实际上,它们的内容却在多个.cpp文件中得到了编译。
通过“定义只能有一次”的规则,我们很容易可以得出,头文件中应该只放变量和函数的声明,而不能放它们的定义。
因为一个头文件的内容实际上是会被引 入到多个不同的.cpp文件中的,并且它们都会被编译。
放声明当然没事,如果放了定义,那么也就相当于在多个文件中出现了对于一个符号(变量或函数)的定义,纵然这些定义都是相同的,但对于编译器来说,这样做不合法。
cpp源文件,代码实现部分,
.ico图标文件,程序运用图标。
rc资源文件,各种资源
.dll动态链接库文件,生成的动态链接库,
.exe应用程序,生成的可执行程序。
dsp空白工程,dsw解决方案
.lib静态库
.ini配置文件。
保存程序配置信息,
obj源文件编译中间文件,可执行二进制代码。
.dsw----这种类型的文件在VC中是级别最高的,称为Workspace文件
.dsp----在VC中,应用程序是以Project的形式存在的,Project文件的扩展名为.dsp,在Workspace文件中可以包含多个Project,由Workspace文件对它们进行统一的协调和管理,每个工程都对应一个dsp文件
.opt----与dsw类型的Workspace文件像配合的一个重要的文件类型是以opt为扩展名的文件,这个文件中包含的是Workspace文件中要用大本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享。
当我们打开一个Workspace文件时,如果系统找不到需要的opt类型文件,就会自动的创建一个与之配合的包含本地计算机信息的opt文件。
.clw----以clw为扩展名的文件是用来存放应用程序中用到的类和资源的信息,这些信息是VC中的ClassWizard工具管理和使用类的信息来源
readme.txt----这个文件每个应用程序都有一个,这个文件中列出了应用程序中用到的所有文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的知识
.h-----这种文件为头文件,包含的主要是类的定义
.cpp----这种文件为实现文件,该种文件包含的主要是类成员函数的实现代码。
一般来说,h为扩展名的文件和cpp为扩展名的文件是一一对应配合使用的
.rc----在VC中以.rc为扩展名的文件为资源文件,其中包含了应用程序中用的所有的Windows资源,要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改
.rc2-----也是资源文件,但这个文件中的资源不能在VC的集成环境下直接进行编辑和修改,而是由我们自己根据需要手工编辑这个文件
.ico,.bmp,.cur-----还有一些具体的资源文件不一一列举
.exe,.dll,.fon,.mod,.drv,.ocx------都是所谓的动态链接库文件
Vcxproj:
工程文件;
.sln;asolutionfile;
.suo:
ahiddensolutionuseroptionsfile;
2、控制台应用程序与Windows应用程序之间的区别?
Windows应用程序是windows窗体应用程序,就是有图形化的GUI、有Windo的循环机制。
控制台应用程序多了一个控制台,是命令行的CUI(那个黑黑的Dos窗口)。
程序的文件头某个位置指定了IMAGE_SUBSYSTEM_WINDOWS_GUIMAGE_SUBSYSTEM_WINDOWS_CUI。
图形化的GUI,或命令行的CUI。
如果是CUI,那么该程序就是控制台程序,它启动的时候就会被自动分配给一个控制台(Console)。
在GUI程序中,窗口不是必要的,虽然绝大部分程序都有。
准确的说,控制台程序也可以创建窗口(MessageBox.Show("")就可以了)。
窗口程序也可以拥有一个控制台(AllocConsoleAPI)。
MFC全称MicrosoftFoundationClasses,也就是微软基础类库。
它是VC++的核心,是C++与WindowsAPI的结合,很彻底的用C++封装了WindowsSDK(SoftwareDevelopmentKit,软件开发工具包)中的结构和功能,还提供了一个应用程序框架,此应用程序框架为软件开发者完成了一些例行化的工作,比如各种窗口、工具栏、菜单的生成和管理等,不需要开发者再去解决那些很复杂很乏味的难题,比如每个窗口都要使用WindowsAPI注册、生成与管理。
这样就大大减少了软件开发者的工作量,提高了开发效率。
3、VC++动态链接库(DLL)编程深入浅出(zz)
(1)、概论
先来阐述一下DLL(DynamicLinkableLibrary)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:
(1)DLL的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是VisualBasic、VisualC++还是Delphi。
(2)动态链接库随处可见
我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类
VisualC++支持三种DLL,它们分别是Non-MFCDLL(非MFC动态库)、MFCRegularDLL(MFC规则DLL)、MFCExtensionDLL(MFC扩展DLL)。
非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。
4、vs2010生成Dll文件并引用dll(C#)
(1)创建新C#控制台应用程序,项目命名createBll,打开Program.cs重命名为TestA(可以不重命名)并修改代码,如图:
写好后,可以写其它的类.cs文件
2、完成后,点击菜单栏的“项目”,下拉单选择“createDll属性”,打开如图窗口
在输出类型选择“类库”,然后关掉该窗口,生成解决方案,即生成了creatBll.dll文件,在项目下createBll\createBll\bin\Debug\createBll.dll目录下。
3、引用Dll文件,新建项目referenceDll,把上面生成的createBll.dll文件复制粘贴到新项目下Debug文件夹下面
4、在referenceDll项目解决方案处的引用点击右键,弹出窗口
浏览标签下,打开referenceDll项目下Debug文件,找到刚才复制过来的createBll.dll文件,单击确定即可引用。
5、双击引用下的createBll打开对象浏览器,展开可以看的createBll.dll文件里封装的方法TestA
6、、编写Program里的相应代码
先引用createBll,然后代码如图,即可调用dll里的方
5、VS2010中调试c++程序的方法
1、vs2010中的debug菜单中常用命令
ContinueF5开始调试
StopDebugingShift+F5停止调试
ToggleBreakpointF9设置断点
StepOverF10单步(不进入函数)
StepInfoF11单步(进入函数)
StepOutShift+F11跳出函数
DeleteAllBreakpointsCtrl+shift+F9删除所有断点
2、设置断点
在程序编辑窗口的左侧灰色区域点击对应的语句位置就可以设置一个断点或都按F9。
3、按F5开始执行调试,程序会在设置的断点处停止。
4、按F10或F11可进行单步测试。
VS2010中的调试技巧
6、创建.h.cpp文件:
1、向项目加入源文件
(1)、我们建立了一个空项目myProg1,下面我们来向其中添加代码源文件。
首先,找到刚才提到的解决方案资源管理器,在其中的项目名称myProg1上点击右键在弹出的菜单中选择添加,如图。
(2)、一般向项目加入源文件的时候有两种情况,一种是你的cpp文件和h文件已经写好了,这时只需要将它们加入工程;另外一种是,你还没有开始写代码,只是先建立了一个工程,这时你可以让VS2010帮你建立代码文件,无论是头文件还是cpp文件。
(3)、cpp和h文件已经写好的情况。
此时我们选择上图中的现有项,弹出对话框如下图。
此时可以选择任何已经存在的文件(用Ctrl和Shift键选择多个文件,这属于Windows基本操作,就不多说了),然后点击确定,就可以完成文件的添加了。
添加文件后的解决方案资源管理器如下。
另外一种方法是选择新建项,此时弹出对话框如下。
一般常用的类型有C++文件和头文件,这点应该不用多说。
这里我们选择C++文件。
后在名称处输入需要创建文件的文件名,以及位置处输入文件被储存的位置(不一定要储存在项目文件夹下,可以存在任何位置,但是一般为了便于管理才都储存于项目文件夹下)。
创建好文件后解决方案资源管理器显示如下。
7、一个解决方案包含多个工程,vs2010解决方案框架
在解决方案上右键添加->新建项目/现有项目即可。
vs2010中一个解决方案建立多个工程后怎么切换
方法一:
每次运行的时候必须点击:
项目-设为启动项目
方法二:
选中一个项目,右键启动新实例,这样就会只编译那一个程序
8、调试时,Debug.printf()使用
9、如何快速熟悉别人的代码
1、先了解系统架构与行为模式,再细读
接触他人的程序码,大致上可以分为三种程度:
一,了解,二,修改,扩充,三,抽取,提炼。
了解别人的程序码是最基础的工作,倘若不能了解自己要处理的程序码,就甭论修改或扩充,更不可能去芜存菁,从中萃取出自己所需,回收再利用别人所撰写的程序码。
虽说是“阅读”,但程序码并不像文章或小说一样,透过这种做法,便能够获得一定程度的了解。
阅读文章或小说时,几乎都是循序地阅读,你只消翻开第一页,一行行阅读下去即可。
但是,有许多程序人在试着阅读其他人的程序码时,却往往有不知如何读起的困难。
或许找到系统的第一页(也就是程序码执行的启始点)并不难,但是复杂度高的系统,有时十分庞大,有时千头万绪。
从程序码的启始点开始读起,一来要循序读完所有的程序码旷日费时,二来透过这种方式来了解系统,很难在脑中构建出系统的面貌,进而了解到系统真正的行为。
所以,阅读程序码的重点,不在于读完每一行程序码,而是在于有效率地透过探索及阅读,从而了解系统的架构及行为模式。
以便在你需要了解任何片段的细节实作时,能够很快在脑上对映到具体的程序码位置,直到那一刻,才是细读的时机。
2、熟悉沟通语言与惯例用语
首先,你最好得了解程序码写成的程序语言。
再来就是要先确认程序码所用的命名惯例(命名惯例)。
了解命名惯例很重要,不同的程序人或开发团队,差异可能很大。
这命名惯例涵盖的范围通常包括了变数的名称,函式的名称,类别(如果是物件导向的话)的名称,原始码档案,甚至是专案建构目录的名称。
倘若使用了像设计模式之类的方法,这些名称更有一些具体的表述方式。
命名惯例有点像是程序人在程序语言之上,另行建构的一组沟通行话。
程序人会透过共通约束,遵守的命名惯例,来表达一些较高阶的概念。
例如,有名的匈牙利式命名法,便将变数名称以属性,型别,说明合并在一起描述。
对程序人来说,这种方式能够提供更丰富的资讯,以了解该变数的作用及性质。
对程序码阅读来说,熟悉这个做法之所以重要,是因为当你了解整个系统所采用的惯例时,你便能试着以他们所共同操用的语汇来进行理解。
倘若,不能了解其所用的惯例,那么这些额外提供的资讯,就无法为你所用。
像以设计模式写成的程序码,同样处处充满着模式的名称,诸如:
工厂,门面,代理等等。
以这些名称指涉的类别,也直接透过名称,表达了它们自身的作用。
对于懂得这命名惯例的读者来说,不需要深入探索,也能很快捕捉到这些类别的意义。
当你拿到一套必须阅读的程序码时,最好先取得命名惯例的说明文件。
然而,并不是每套程序码都附有此类的说明文件。
另一个方式,就是自己到程序码中,大略浏览一遍,有经验的程序人可以轻易发掘出该系统所用的命名惯例。
常见的命名方式不脱那几类,这时候经验就很重要,倘若你知道的惯例越多,就越能轻易识别他人所用的惯例。
如果运气很糟,程序码所用的惯例是前所未见的,那么你也得花点时间归纳,凭自己的力量找出这程序码命名上的规则。
3、要了解一个系统,最好是采取由上至下的方式。
先试着捕捉系统架构性的观念,不要过早钻进细节,因为那通常对于你了解全貌,没有多大的帮助。
阅读程序码不需要从第一行读起,我们的目的并不是在于读遍每一段程序码。
4、阅读程序码的目的,在于了解全貌而非细节
想要读懂别人程序码的根本基础,便是了解对方所用的程序语言及命名惯例。
有了这个基础之后,才算是具备了基本的阅读能力。
阅读程序码却大大不同。
我们很少从第一行开始读起,因为除非它是很简单的单执行绪程序,否则很少这么做。
因为要是这么做,就很难了解整个系统的全貌。
是的,我们这边提到了一个重点,阅读程序码的目的在于了解系统的全貌,而不是在于只是为了地毯式的读遍每一段程序码。
就拿物件导向程序语言所写成的系统来说,整个系统被拆解,分析成为一个个独立的类别。
阅读个别类别的程序码,或许可以明白每项类别物件个别的行为。
但对于各类别物件之间如何交互影响,如何协同工作,又很容易陷入盲人摸象的困境。
这是因为各类别的程序码,只描述个别物件的行为,而片段的阅读就只能造就片面的认识。
5、由上而下厘清架构后,便可轻易理解组成关系
如果你想要跳脱困境,不想浪费大量时间阅读程序码,却始终只能捕捉到对系统片段认识,就必须转换到另一种观点来看待系统。
从个别的类别行为着手,是由下至上(自下而上)的方法;在阅读程序码时,却应该先采由上至下(自上而下)的方式。
对程序码的阅读来说,由上至下意谓着,你得先了解整个系统架构。
系统的架构是整个系统的骨干,支柱。
它表现出系统最突出的特征。
知道系统架构究竟在于那一种类型,通常大大有益于了解系统的个别组成之间的静态及动态关系。
有些系统因为所用的技术或框架的关系,决定了最上层的架构。
例如,采用的JavaServlet的/JSP的技术的应用系统,最外层的架构便是以J2EE的(或起码的J2EE中的Web容器)为根本。
系统的架构是整个系统的骨干,支柱。
它表现出系统最突出的特征。
知道系统架构究竟属于那一种类型,通常大大有益于了解系统的个别组成之间的静态及动态关系。
有些系统因为所用的技术或框架的关系,决定了最上层的架构。
例如,采用的JavaServlet的/JSP的技术的应用系统,最外层的架构便是以J2EE的(或起码的J2EE中的Web容器)为根本。
10、c++中的注释(//单行注释和/*多行注释*/)
(1)注释可以帮助其他人阅读程序通常用于概括算法、确认变量的用途、阐明难以理解的代码段,注释并不会增加可执行程序的大小,编译器会忽略所有注释。
(2)注释对不可嵌套
(3)注释要随着代码的改变而改变。
(4)//表示单行注释
(5)/**/表示多行注释
11、VS2010中常见的错误与解决方法
1、errorc101008a解决方法
该错误出现在项目升级过程中会出现,比如说项目从vs2008升级到vs2010.
解决办法:
在项目上点右键,清理(Clean),重新编译,问题解决
2、errorC2252解决方法
该错误主要在项目从vs2008升级到vs2010出先。
errorC2252:
anexplicitinstantiationofatemplatecanonlyoccuratnamespacescope
解决方法:
将特例话的模板移到类外面(Itissayingthatyoucannotexplicitlyinstantiateatemplateinsideafunctionoraclass.Moveittooutsidethefunctionorclass.)
3、errorC2143:
语法错误:
缺少“;”(在“*”的前面)
该错误主要是某类型数据未include,可能是都文件拼写错误、或者头文件名已经更改、或是头文件忘记“;”
解决办法:
检查头文件是否更名、是否忘记结束的“;”
4、errorC1010:
查找预编译头时遇到意外的文件结尾。
是否忘记了向源中添加“#include"StdAfx.h”
解决办法:
在报错行所在的文件的最前面添加“#include"StdAfx.h”
5、errorC1189:
出现了WINDOWS.Halreadyincluded.MFCappsmustnot#include
解决办法:
把#include
6、errorLNK2005:
_DllMain@12alreadydefinedindllmain.obj
解决办法:
你只需要在工程设置里面把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL
中的_USRDLL,删除,就可以正确编译了
7、R6010错误,出现R6010错误的原因很多
(1)数据库缺少一个视图、
(2)数据库某个存储过程名发生变化,也可能是参数个数发生变化。
(3)exe和dll是否混用的不同版本的crt
(4)内存资源未释放
(5)输出参数不正确
总之:
windows将自身无法定位到的错误类型都归结为R6010错误
8、errorC2361:
initializationoferrorC2361:
initializationof'iter2'isskippedby'default'label
解决办法:
出现这个问题原因是因是switch没有正常的初始化,只需要在iter2的位置控制其作用域即可,在这里添加{}就可以了。
案例分析:
来自实际项目的一段代码,简化形式如下:
switch(t)
{
case0:
inta=0;
break;
default:
break;
}
有什么问题吗?
似乎没有。
请用编译器编译一下……
嗯?
!
一个错误“errorC2361:
initializationof'a'isskippedby'default'label”。
这怎么可能?
几番思琢,悟出解释:
C++约定,在块语句中,对象的作用域从对象的声明语句开始直到块语句的结束,也就是说default标号后的语句是可以使用对象a的。
如果程序执行时从switch处跳到default处,就会导致对象a没有被正确地初始化。
确保对象的初始化可是C++的重要设计哲学,所以编译器会很严格地检查这种违例情况,像上述的示例代码中default语句后面并没有使用a,
但考虑到以后代码的改动可能无意中使用,所以一样被封杀。
明白了原因,解决起来就很容易了。
只要明确地限制对象a的作用域就行了。
switch(t)
{
case0:
{//addedforfixproblem
inta=0;
break;
}//addedforfixproblem
default:
break;
}
在switch...case...结构中不能在case中定义新变量,for(inti=0;...)
除非将定义新变量的case用块{}包住,或者选择将你的新变量在switch之前。
9、Link2019:
unresolvedexternalsymbol'symbol'referencedinfunction'function'
函数只有申明,没有实现时,或是DLL中的函数没有export
10、errorc101008a解决方法
该错误出现在项目升级过程中会出现,比如说项目从vs2008升级到vs2010.
解决办法:
在项目上点右键,清理(Clean),重新编译,问题解决
11、errorC2252解决方法
该错误主要在项目从vs2008升级到vs2010出先。
errorC2252:
anexplicitinstantiationofatemplatecanonlyoccuratnamespacescope
解决方法:
将特例话的模板移到类外面(Itissayingthatyoucannotexplicitlyinstantiateatemplateinsideafunctionoraclass.Moveittooutsidethefunctionorclass.)
12、errorC2143:
语法错误:
缺少“;”(在“*”的前面)
该错误主要是某类型数据未include,可能是都文件拼写错误、或者头文件名已经更改、或是头文件忘记“;”
解决办法:
检查头文件是否更名、是否忘记结束的“;”
13、errorC1010:
查找预编译头时遇到意外的文件结尾。
是否忘记了向源中添加“#include"StdAfx.h”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS 使用方法 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)