如何将C/C++程序转译成Delphi(六)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

3.4. Strings

In C, as in Delphi, a string is an array of char types. Often, a string declaration is used in combination with a constant declaration specifying the maximum string length, as the following example shows:

#define RAS_MaxEntryName 256

#define RASENTRYNAMEA struct tagRASENTRYNAMEA

RASENTRYNAMEA

{

DWORD dwSize;

CHAR szEntryName[ RAS_MaxEntryName + 1 ];

};

The first line declares a constant RAS_MaxEntryName with the value 256 specifying the maximum length of the string. The lines after it declare a struct (record) which contains a null-terminated string:

CHAR szEntryName[ RAS_MaxEntryName + 1 ];

The Delphi translation:

szEntryName : Array [0..RAS_MaxEntryName] of Char;

Why not Array [0..RAS_MaxEntryName+1] of Char? Recall that a C array starts with 0 and the declaration specifies the number of elements. Thus, Array [0..RAS_MaxEntryName+1] in Delphi is equivalent to [RAS_MaxEntryName+2] in C.

Back to contents --

Back to contents

--3.5. Enumerations - Two Methods

Enumerated types can be translated in two ways.

Method 1:

typedef enum _FINDEX_INFO_LEVELS {

FindExInfoStandard,

FindExInfoMaxInfoLevel

} FINDEX_INFO_LEVELS;

This part of a C-header file translates easily to Delphi:

Type

TFindExInfoLevels = (FindExInfoStandard,

FindExInfoMaxInfoLevel);

The ordinal Value of the item FindExInfoStandard is 0. In Delphi each enumeration starts with 0.

Method 2:

The following C-declaration is more problematic:

typedef enum _ACL_INFORMATION_CLASS {

AclRevisionInformation = 1,

AclSizeInformation

} ACL_INFORMATION_CLASS

The "= 1" in the declaration forces C to start with the ordinal value 1. This is not possible in Delphi.

There are two ways to solve the problem.

Solution a): Declare the enumeration as

TACLInformationClass = (_Fill0,

AclRevisionInformation,

AclSizeInformation);

Solution b): Translate the enumeration as

CONST

AclRevisionInformation = 1;

AclSizeInformation = 2;

TYPE

TACLInformationClass = DWord;

That's no problem for this example. But in C it's possible to specify the ordinal value of each item of the enumeration, for example:

Typedef enum _ENUMEXAMPLE {

Item1 = 5,

Item2 = 10,

} ENUMEXAMPLE;

Using enumeration in Delphi the declaration would have to be done like this:

TEnumExample = (_Fill0,

_Fill1,

_Fill2,

_Fill3,

_Fill4,

Item1,

_Fill6,

_Fill7,

_Fill8,

_Fill9,

Item2);

This is hard to read and clumsy to maintain.

This works better:

CONST

Item1 = 5;

Item2 = 10;

TYPE

TEnumExample = DWord;

Back to contents --

Back to contents

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航