本人之前都是从事C#的winform开发,对于c++,虽说大学学过,但毕竟第一所学甚浅,第二放下的日子也甚久,故而本套博客,本人将其定义为菜鸟学c++,所有工具为vs2010.之所以采用vs2010,纯粹由于之前c#用vs用习惯了。
安装vs2010的步骤本文就不再介绍,可去微软官方查看。
下面介绍c++最简单,也入门必先遇到的项目类型:win32控制台。
-
新建项目:
File->new->project,弹出的对话框中选择win32 Console Appliaction,弹出的对话框中点击next,在新弹写出的对话框中选择你所新建项目的类型以及一些属性设置。如下图四中。
Windows Application:windows应用程序。
Console Application:控制台应用程序,也就是我们即将需要创建的。
DLL:链接库,动态链接库。
Static Library:静态链接库。
图一
图二
图三
图四
点击Finish即可,随后出现
其中左边自动生成一系列文件:
stdafx.h:此处需要首先理解c++的编译机制,一个c++项目必然存在很多头文件和cpp文件,那么在编译的时候,编译器是如何将其组成一个dll或者可执行文件。此处,实际上,编译器仅仅编译cpp文件,根据.cpp文件include的.h文件,继而去编译对应的.h文件。那么当很多.cpp文件引用一些公用的.h文件时,如果为每个.cpp文件分别去处理这些.h文件,显得有点浪费工作。故而出现了stdafx.h文件,将所有标准头文件的include均放在该头文件中,而对应cpp文件仅需要inlude该文件即可。编译器认为所有在#include "stdafx.h"前的代码都是预编译的,他讲跳过该指令 。具体运行原理如下:
AppWizard和VisualC++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的标准头文件。且这一文件可以随被选择的选项而变化。
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)
◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h。
使用该文件,必须遵守以下规则:
◎你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
targetver.h:定义版本宏。其中自动的英文注释为:
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and // set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. |
文件HelloWorld.cpp中_tmain函数为程序运行时入口:
int _tmain(int argc, _TCHAR* argv[]) { return 0; } |
为函数入口,在此处添加程序启动需要加载或运行的指令即可。如:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) { cout<<"hello world"<<endl; system("PAUSE"); return 0; } |
此时运行程序可到:
附录:
1、动态链接库(Dynamic Linked Library)
Windows系统平台上你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载 到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而 且使这些DLL模块可以同时被多个应用程序使用。Windows自己就将一些主要的系统功能以DLL模块的形式实现。Windows为应用程序提供了丰富的函数调用, 这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程 的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个 函数。
在使用动态链接库的时候,往往提供 两个文件:一个引入库(Import Library)和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接 可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执 行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。 一个Windows的.EXE文件拥有它使用不同动态链接库的引 用,所使用的函数即在那里。当Windows程序被加载到内存中时,程序中的调 用被指向DLL函数的入口,如果DLL不在内存中,系统就将其加载到内存 中。当链接Windows程序以产生一个可执行文件时,你必 须链接由编程环境提供的专门的"导入库(import library)库"。这些导入库包含了动态链接库名称和 所有Windows函数调用的引用信息。链接程序使用 该信息在.EXE文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。
2、静态库(Static Library)
函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链 接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。
导入库和静态库的区别很大,他们实质 是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序 找到对应函数的一些基本地址信息。
静态链接与动态链接:
静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来静态库的链接可以使用 静态链接,动态链接库也可以使用这种方法链接导入库
动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始 就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时 候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的 程序。