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.
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;
博客主要介绍了C语言到Delphi的代码转换,包括字符串和枚举类型。在字符串方面,说明了C语言中字符串是字符数组,以及Delphi中对应声明的差异;在枚举类型上,阐述了两种转换方法及遇到的问题和解决办法。
62

被折叠的 条评论
为什么被折叠?



