MFC中一些宏的说明.doc_第1页
MFC中一些宏的说明.doc_第2页
MFC中一些宏的说明.doc_第3页
MFC中一些宏的说明.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MSC_VER _MSC_VER 定义编译器的版本。下面是一些编译器版本的_MSC_VER值(参见扩展阅读中的参考文献2的链接) MS VC+ 9.0 _MSC_VER = 1500 MS VC+ 8.0 _MSC_VER = 1400 MS VC+ 7.1 _MSC_VER = 1310 MS VC+ 7.0 _MSC_VER = 1300 MS VC+ 6.0 _MSC_VER = 1200 MS VC+ 5.0 _MSC_VER = 1100 其中MS VC+ 9.0就是Visual C+ 2008,MS VC+ 8.0就是Visual C+ 2005。版本名称上的的对应关系参见扩展阅读中的参考文献1的链接. 在程序中加入_MSC_VER宏可以根据编译器版本让编译器选择性地编译一段程序。例如一个版本编译器产生的lib文件可能不能被另一个版本的编译器调用,那么在开发应用程序的时候,在该程序的lib调用库中放入多个版本编译器产生的lib文件。在程序中加入_MSC_VER宏,编译器就能够在调用的时根据其版本自动选择可以链接的lib库版本,如下所示。 #if _MSC_VER = 1400 / for vc8, or vc9 #ifdef _DEBUG #pragma comment( lib, SomeLib-vc8-d.lib ) #else if #pragma comment( lib, SomeLib-vc8-r.lib ) #endif #elif _MSC_VER = 1310 / for vc71 #ifdef _DEBUG #pragma comment( lib, SomeLib-vc71-d.lib ) #else if #pragma comment( lib, SomeLib-vc71-r.lib ) #endif #elif _MSC_VER =1200 / for vc6 #ifdef _DEBUG #pragma comment( lib, SomeLib-vc6-d.lib ) #else if #pragma comment( lib, SomeLib-vc6-r.lib ) #endif #endif 本编辑词条参考自扩展阅读中的链接。关于_MSC_VER更详细的说明请点击阅读扩展阅读中的参考文献3,4的链接。于AFX_NOVTABLE的说明2010-06-04 10:54 今天在看MFC的源代码时,发现基类CObject的定义是如下形式:#ifdef _AFXDLLclass CObject#elseclass AFX_NOVTABLE CObject#endif_AFXDLL是什么东西呢,从网上搜索了一下,发现当新建工程时选择Use MFC in a Shared DLL,则在工程的预编译参数Preprocessor definitions中会自动加入_AFXDLL宏定义,而如果在新建工程时选择Use MFC in a Static Library则不会添加该宏定义,这时基类CObject的定义变为class AFX_NOVTABLE CObject,而AFX_NOVTABLE宏定义又有什么用途呢?继续追踪该宏的定义发现:#ifndef AFX_NOVTABLE#if _MSC_VER = 1100 & !defined(_DEBUG)#define AFX_NOVTABLE _declspec(novtable)#else#define AFX_NOVTABLE#endif#endif_MSC_VER用于说明编译器的版本,如MS VC+ 6.0 _MSC_VER = 1200,MS VC+ 5.0 _MSC_VER = 1100,即当工程编译版本不是debug版本时,宏AFX_NOVTABLE相当于_declspec(novtable),_declspec(novtable)主要是为了减少release版本的最终目标文件的大小,其具体含义可以参考我的另一篇文章:C+中 _declspec(novtable) 的探讨。 总体上来说对CObject类定义时的一系列修饰是想在以Use MFC in a Static Library方式生成文件时尽量减小文件的大小。C+中 _declspec(novtable) 的探讨2010-04-14 17:40(1)V TA B L E(虚函数表)和VPTR(指向虚函数标的指针)的区别编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟。编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数调用插入代码,所有这些都是自动发生的,所以我们不必担心这些。利用虚函数,这个对象的合适的函数就能被调用,哪怕在编译器还不知道这个对象的特定类型的情况下。(C+编程思想)(2)微软的描述This form of _declspec can be applied to any class declaration, but should only be applied to pure interface classes, that is classes that will never be instantiated on their own. The _declspec stops the compiler from generating code to initialize the vfptr in the constructor(s) and destructor of the class. In many cases, this removes the only references to the vtable that are associated with the class and, thus, the linker will remove it. Using this form of _declspec can result in a significant reduction in code size. (纯虚类和减少文件大小是这短定义的精华)(3)静态联编 和 动态联编 的区别 静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,因为这种联编过程是在程序开始运行之前完成的。在编译时所进行的这种联编又称静态束定。在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为束定,在编译时束定又称静态束定。编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编,或称动态束定,又叫晚期联编。(4)例子代码分析class _declspec(novtable) A public: A() virtual void Fun1() virtual void Fun2() ; class _declspec(novtable) B : public A public: B() virtual void Fun1() virtual void Fun3() virtual void Fun4()Fun2(); ; class C : public B public: C() ; void MyFunc() C c; /由于 class C没有_declspec(novtable),VTable会创建成功 c.Fun1(); /调用 B:Fun1() ; 静态联编 c.Fun2(); /调用 A:Fun2() ;静态联编 B b; /由于 class C有_declspec(novtable),VTable不会创建成功 A aa = b; aa.Fun1(); /调用 A:Fun1();静态联编 b.Fun1(); /调用 B:Fun1();静态联编 b.Fun2(); /调用 A:Fun1();静态联编 b.Fun4(); /出错. 类的成员函数里调用虚函数需要 vtable指针,但是class B是不允许产生vtable指针的. B* pb = new B(); pb-Fun1(); / 出错.Class B没有vtable指针; 动态联编 C* pc = new C; /由于 class C没有_declspec(novtable),VTable会创建成功; A,B,C 三个 /class的Vtable and VPTR是同一个,即class的Vtale and VPtr A* pa = pc; /动态联编 pa-Fun1(); /调用 B:Fun1() ; 动态联编 希望通过以上分析,能够比较好的理解关键字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论