windows编程中遇到的各种宏的意义

来源:互联网 发布:mac 照片分类 编辑:程序博客网 时间:2024/06/05 00:19

       在日常工作和学习中难免遇到各种各样的宏定义,有时候把自己搞的晕乎乎的,下面我收集了一些宏定义,给自己做个笔记(其中很大一部分是MFC里面的宏):

       _ATL_CSTRING_EXPLICIT_CONSTRUCTORS: Makes certain CString constructors explicit, preventing any unintentional conversions。

       _AFX_NO_OLE_SUPPORT: use this if you do not need OLE support。

       _AFX_NO_AFXCMN_SUPPORT: MFC 对 Windows 公共控件的支持。

       _UNICODE: 宽字符。

       __cplusplus: c++。

       _WIN32:win32环境。

      #define WINAPI __stdcall:stdcall调用约定stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK,stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈 3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。例:int __ stdcall function(int a,int b),参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成: push 2 第二个参数入栈 push 1 第一个参数入栈 call function 调用参数,注意此时自动把cs:eip入栈 而对于函数自身,则可以翻译为: push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp 保存堆栈指针 mov eax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp,cs:eip,a,b,ebp +8指向a add eax,[ebp + 0CH] 堆栈中ebp + 12处保存了b mov esp,ebp 恢复esp pop ebp ret 8 而在编译时,这个函数的名字被翻译成_function@8。
       VC_EXTRALEAN:从 Windows 标头中排除不常使用的资料。
       #define WINVER 0x0400:允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
       #define _WIN32_WINNT 0x0500:允许使用 Windows NT 4 或更高版本的特定功能。为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
       #define _WIN32_WINDOWS 0x0410:允许使用 Windows 98 或更高版本的特定功能。为 Windows Me 及更新版本改变为适当的值。
       #define _WIN32_IE 0x0400:允许使用 IE 4.0 或更高版本的特定功能。为 IE 5.0 及更新版本改变为适当的值。
       #define _AFX_ALL_WARNINGS:关闭 MFC 对某些常见但经常被安全忽略的警告消息的隐藏。
       #define _AFXDLL:定义这个符号表示动态连接MFC。
       _DEBUG:debug版本。

__declspec(novtable) 在C++中接口中广泛应用. 不容易看到它是因为在很多地方它都被定义成为了宏. 比如说ATL活动模板库中的ATL_NO_VTABLE, 其实就是__declspec(novtable).

 __declspec(novtable) 就是让类不要有虚函数表以及对虚函数表的初始化代码, 这样可以节省运行时间和空间. 但是这个类一定不允许生成实例, 因为没有虚函数表, 就无法对虚函数进行调用. 

因此, __declspec(novtable)一般是应用于接口(其实就是包含纯虚函数的类), 因为接口包含的都是纯虚函数, 不可能生成实例. 我们把 __declspec(novtable)应用到接口类中, 这些接口类就不用包含虚函数表和初始化虚函数表的代码了. 它的派生类会自己包含自己的虚函数表和初始化代码.

       
0 0
原创粉丝点击