我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: C++ 异常处理 B 显示签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

klo



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
家族: YD一族
发贴: 473
威望: 0
浮云: 1105
在线等级:
注册时间: 2007-01-10
最后登陆: 2008-06-30

5come5帮你背单词 [ faint /feint/ a. 微弱的,微小的,暗淡的;vi. 晕倒,昏厥 ]


C++ 异常处理 B


为支持VCL、C++Builder实现、转换或另外映射了大多数ObjectPascal的数据类型、结构及语言概念到C++语言。这些通过下列方式完成:
· 使用Typedefs转换到C++原本的类型。
· 类、结构、类模板。
· C++语言对应。
· 宏。
· 关键字、ANSI适用的语言扩展。

不是ObjectPascal语言的所有的方面都严格地映射到C++。偶尔,在使用语言的这些部分时会在应用程序中导致意外的行为。例如:
· 一些类型在ObjectPascal和C++中都存在,但是定义不同。当在两种语言之间共享代码时,会要求一个警告。
· 一些扩展为支持C++Builder而被加入ObjectPascal。它们偶尔会在相互操作时产生微妙的影响。
· ObjectPascal中没有映射到C++语言的类型和语言结构,当C++Builder在语言之间共享代码应避免使用。
本节总结C++Builder如何实现ObjectPascal语言,并建议何时使用警告。

9.2.1 Typedefs
大多数ObjectPascal本身的数据类型在C++Builder中使用typedef转换到C++原本的类型。这可在sysmac.h中找到。无论何时,只要有可能,都应该使用C++原本的类型,而不是ObjectPascal类型。

9.2.2 支持ObjectPascal语言的类
有些ObjectPascal数据类型和语言结构没有内嵌的C++对应实现的类或结构。类模板也像Object Pascal语言结构一样实现数据类型,与set相似,在其中可声明特殊的类型。上述这些的声明可在下列头文件中找到:
dstring.h、wstring.h、sysclass.h、syscomp.h、syscurr.h、sysdyn.h、sysopen.h、sysset.h、systdate.h、systobj.h、systvar.h、sysvari.h。
在这些头文件中实现的类被创建来支持ObjectPascal例程使用的原本的类型。当在基于VCL的代码中调用这些例程时可使用它们。

9.2.3 ObjectPascal语言的C++语言对应
ObjectPascal中的var和untyped参数都是C++本身所没有的。但它们都有其C++语言对应,以便在C++Builder中使用。

1.var参数
C++和ObjectPascal都有“按引用传递”这个概念。这些是可变参数。在ObjectPascal中它们被称为var参数。使用var参数的函数的语法是,
prdcedure myfunc(var x : integer);

在C++中,应按引用传递这些参数类型:
void myFunc(int&x);

C++引用和指针能被用来修改对象。但引用更接近匹配var参数,因为,不同于指针,引用不能被重指,而var参数不能被再分配;尽管它们引用的“值”都可被改变。

2.untyped参数
ObjectPascal允许一种不确定类型的参数。这些参数被传递给函数时没有定义类型。接收的函数必须在使用它之前将参数强制转换到一种已知类型。C++Builder用指向空的指针(pointers-to-void)—void*,对应解释untyped参数。接收的函数必须将空指针强制转换为所需类型的指针。例如:




9.2.4 动态数组
ObjectPascal有一种“动态数组”的结构,可允许传递给函数一个不定长的数组。C++对这种类型没有直接的支持,所以有一个动态数参数的ObjectPascal函数可通过显式传递两个指针来调用,它们分别指向数组的第一个元素和最后一个索引值(数组元素数减1)。
例如,在math.hpp中的Mean函数以ObjectPascal声明为:




以C++声明为:




下列代码说明以C++调用Mean函数:




注意 在与上例类似的情况中,在ObjectPascal函数使用var参数的地方,C++函数声明的参数不能是const。

1.计算元素数
当使用sizeof()、ARRAYSIZE宏或EXISTINGARRAY宏计算数组中的元素数时,要小心不能使用指向数组第一元素的指针。应传递数组名:




获取一个数组的“sizeof”与获取一个指针的“sizeof”不一样。例如,给定下列声明,




获取数组长度显示如下:
sizeof (d) /sizeof d(0)

不能像获取指针长度一样计算:
sizeof (p) sizeof (p[0])

下面的例子使用ARRAYSIZE宏代替sizeof()操作符。关于ARRAYSIZE宏的更多信息,参见联机帮助。

2.临时
ObjectPascal支持把未命名的临时(temporaries)动态数组传递给函数。在C++中没有这种语法。然而,因为变量定义可混合在其他语句内,所以,简单地向变量提供一个名字是一种方法。ObjectPascal:




C++,使用一个命名的“临时”:




要限制命名的“临时”范围避免与其他的局部变量混淆,需打开一个新范围:




另外的方法参见OPENARRAY宏。

3.常数数组
ObjectPascal支持一种名为“arrayofconst(常数数组)”的语言结构。这种参数类型与按值获取TVarRec的一个动态数组一样。
下列ObjectPascal代码声明接受一个常数数组:




在C++中,原型是:




函数的调用与其他获取动态数组的函数一样:




4.OPENARRAY宏
在sysopen.h定义的OPENARRAY宏可作为使用命名的变量把临时动态数组传递给按值获取动态数组的函数的另一个选择。宏的使用为:




T构造为动态数组类型。例如:




使用OPENARRAY宏时,最多19值被传递。如果需要一个更大的数组,必须定义显式变量。另外使用OPENARRAY宏带来附加的(但是很小)的运行时开销,这是由于分配内在数组的开销和每个值的一个附加的拷贝两方面的原因造成的。

5.EXISTINGARRAY宏
在sysopen.h被定义了的EXISTINGARRAY宏能被用来在期望为动态数组的地方传递一个存在的数组。宏的使用如下:




注意“计算元素数”中的讨论也适用于EXISTINGARRAY宏。

6.带动态数组参数的C++函数
当编写一个将会被传入从ObjectPascal而来的动态数组的C++函数时,重要的是显式地保持“按值传递”语义。特别对于声明对应于“按值传递”的函数,需确保在修改元素之前显式拷贝它们。在Object Pascal中,动态数组是一种内嵌的类型并且能按值传递。在C++中,动态数组类型使用指针实现,若不做一个局部拷贝,将改变原来的数组。

9.2.5定义不同的类型
在ObjectPascal和C++中定义不相同的类型应该引起注意。它们在一些问题上常常差异很大。所以,本节讨论这些类型。

1.布尔数据类型
ObjectPascal的ByteBool、WordBool和LongBool数据类型的True值在ObjectPascal中代表-1。False代表0。
注意 Boolean数据类型仍然未改变(True=1,False=0)。当C++的bool类型将这些ObjectPascal类型正确转换时,在使用Windows的BOOL类型(它代表1)
共享WinAPI函数或任何其他函数时,就会有一个问题。如果传递的参数的值的类型为BOOL,它在ObjectPascal中计算-1,在C++中计算1。因此,如果在这两种语言之间共享代码,除非都是0(False,false),否则两个标识符的任何比较都会失败。作为一个解决办法,可使用下列方法来比较:

!A==!B;
表9-2显示出使用这个方法的比较结果:




使用这个比较方法,任何一组值将能正确计算。

2.Char数据类型
C++的char类型是一种确认的类型,而它在ObjectPascal是一种未确认的类型。在共享代码时因为这个差别而有问题发生,是极其少见的。

9.2.6 资源字符串
如果在一个Pascal单元中有使用资源字符串的代码,ObjectPascal编译器(DCC32)在产生头文件时,为每个资源字符串产生一个全局变量和一个相应的预编译宏。这些宏用于自动装载资源字符串,并且在C++代码中所有引用资源字符串的地方使用。例如,在ObjectPascal代码的resourcestring节中可包含:




ObjectPascal编译器为C++Builder产生的相应代码将是:




这使你能够使用ObjectPascal资源字符串,而不必须显式调用LoadResourceString。

 
51CTO.com 技术成就梦想
Copyright©2005-2008

顶端 Posted: 2007-08-10 19:03 | [楼 主]
我来我网·5come5 Forum » 程序员之家

Total 0.007969(s) query 4, Time now is:11-23 03:51, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号