VC预处理命令 第4页|报告
引号格式 这种格式让预处理器首先搜索与包含#import语句的文件同一目录的类型库文件,然后在所有包括(#i nclude)该文件的目录中搜索,最后在如下路径中搜索
尖括号格式 这种格式指示预处理器沿以下路径搜索类型库文件
编译器在以下目录中搜索已命名的文件:
1. PATH环境变量路径表。
2. LIB环境变量路径表。
3. 用/I(额外的包括目录)编译器选项指定的路径。#import可以任选地包含一个或多个属性。这些属性使编译器改变类型库头文件的内容。一个反斜杠(\)符可用在一个单一的#import语句中包含额外的行,例如:
#import "test.lib" no_namespace \
rename("OldName","NewName")
#import属性列出如下:
exclude high_method_prefix
high_property_prefixes implementation_only
include(...) inject_statement
named_guids no_auto_exclude
no_implementation no_namespace
raw_dispinterfaces raw_interfaces_only
raw_method_prefix raw_native_types
raw_property_prefixes rename
rename_namespace
#import指令可创建两个在C++源代码中重构类型库内容的头文件,第一个头文件和用Microsoft接口定义语言(MIDL)编译器生成的头文件类似,但有额外的编译器生成代码和数据。第一个头文件与类型库有相同的基本名,其扩展名为.TLH。第二个头文件也有与类型库相同的基本名,其扩展名为.TLI。它包括了编译器生成成员函数的实现,且被包含在(#i nclude)的第一个头文件内。
两个头文件都在用/Fo(命名对象文件)选项指定的输出目录中。随后它们被读出和编译,就像第一个头文件被#i nclude指令命名一样。
以下是伴随#import指令的编译器优化:
* 头文件被创建时,将被分配与类库相同的时间标志。
* 处理#import时,编译器首先测试头文件是否存在,是否过期。若条件为真,就不需重新创建。
* 编译器延迟对于OLE子系统的初始化,直到碰到第一个#import命令。
#import指令也可参与最小重建且可被置于一个预编译头文件中。
基本类型库头文件
基本类型库头文件由七个部分组成:
1. 头部固定正文:由注释、COMDEF.H(定义用在头部的一些标准宏)的#i nclude语句和其它繁杂的安装信息组成。
2.前向引用和类型定义:由象struct IMyinterface之类的结构说明和用于一些TKIND_ALIAS项的类型定义组成。
3.灵敏指针说明:模块类_com_ptr_t是一个封装接口指针和消除调用AddRef、Release 和QueryInterface函数需求的灵敏指针实现。此外,它隐藏了创建一个新COM对象中的CoCreateInstance调用。此部分采用宏语句_COM_SMARTPTR_TYPEDEF将COM接口的类型定义创建为_com_ptr_t模板类的模板特例化。例如,对于界面IFoo,.TLH文件包含有:
_COM_SMARTPTR_TYPEDEF(IFoo,_ _uuidof(IFoo));
编译器将其扩展为:type def _com_ptr_t<_com_IIID<IFoo,_ _uuidof(IFoo) >> IFooPtr;
类型IFooPtr可以用在原始的界面指针IFoo*的地方。结果,就不需调用各种IUnknown成员函数。
4. 类型信息(typeinfo)说明:主要由类定义和其它项组成,这些项说明由ITyptLib:GetTypeInfo返回的单个的信息类型项目。在这部分,每个来自于类型库的信息类型都以一种依赖于TYPEKIND信息的格式反映在该头部。
5. 任选旧式GUID定义:包含命名的GUID常量的初始化过程,这些定义是格式CLSID_CoClass和IID_Interface的名称,与那些由MIDL编译器产生的类似。
6. 用于第二个类型库头部的#i nclude语句。
7. 结尾固定正文:目前包括#pragma pack(pop)。
以上这些部分除头部固定正文和结尾固定正文部分之外,都被包括在原来的IDL文件中以library语句指定其名称的名称空间中。你可以通过用名称空间显式限定或包括如下语句从类型库头部使用该名称。
using namespace MyLib
在源代码的#import语句之后立即
名称空间可用#import指令的no_namespace属性来阻止。但阻止的名称空间可能导致名称冲突。名称空间也可用rename_namespace属性重新换名。
编译器提供完全路径给需要依赖当前正在处理的类型库的任何类型库。路径以注释格式写入到由编译器为每个处理的类型库生成的类型库头部(.TLH)。
如果一个类型库包含了对其它类型库定义的类型引用,.TLH文件将包括以下注释:
//
//Cross-referenced type libraries:
//
//#import "c:\path\typelib0.tlb"
//
在#import注释中的实际文件名是存储在寄存器中交叉引用的类型库全路径。如果你遇到由于省略类型定义的错误时,检查.TLH头部的注释,看哪一种依赖类型库需要先输入。在编译该.TLI文件时可能的错误有语法错误(例如C2143,C2146,C2321)、C2501(缺少说明指示符)或C2433(在数据说明中禁止′inline′)。
你必须确定哪些依赖注释是不被系统头部给出的,而是在依赖类型库的#import指令前的某处给出一个#import指令以消除这些错误。
exclude属性exclude(“称1”[,“名称2”,...])
名称1
被排斥的第一个项
名称2
被排斥的第二个项(如有必要)
类型库可能包含在系统头部或其它类型库内定义的项的定义。该属性可用于从生成的类型库头文件中排斥这些项。这个属性可带任意数目的参量,每个参量是一个被排斥的高级类型库项目:
high_method_prefix属性
high_method_prefix("Prefix")
Prefix
被使用的前缀
在缺省的情况下,高级错误处理属性和方法用一个无前缀命名的成员函数来展示。这个名称来自于类型库。high_method_prefix属性说明一个前缀以用于命名这些高级属性和方法。
high_property_prefixes属性
high_property_prefixes("GetPrefix,""PutPrefix,""PutRefPrefix")
GetPrefix
用于propget方法的前缀
PutPrefix
用于propput方法的前缀
PutRefPrefix
用于propputref方法的前缀
在缺省情况下,高级错误处理方法,如propget、propput和propputref,分别采用以前缀Get、Put和PutRef命名的成员函数来说明。high_property_prefixes属性用于分别说明这三种属性方法的前缀。
implementation_only属性
implementation_only属性禁止.TLH头文件(基本头文件)的生成。这个文件包括了所有用于展示类型库内容的说明。该.TLI头文件和wrapper成员函数的实现,将被生成且包含在编译过程中。
当指定该属性时,该.TLI头部的内容将和用于存放普通.TLH头部的内容放在相同的名称空间。此外,该成员函数不会作为联编说明。implementation_only属性一般希望与no_implementation属性配对使用,以跟踪预编译头文件(PCH)之外的实现。一个有no_implementation属性的#import语句被置于用来创建pch
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
VC预处理命令 第4页下载如图片无法显示或论文不完整,请联系qq752018766