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

原创 2001年07月24日 13:29:00

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

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

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

Conversion Tutorial Draft 4 27 JANUARY, 1998by Andreas Prucha Contents Anatomy of a C Header Convers...
  • mysine
  • mysine
  • 2001年07月24日 13:22
  • 616

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

2.2. Unit dependencies Back to contents -->C and C++ use #include to include header files in another...
  • mysine
  • mysine
  • 2001年07月24日 13:26
  • 690

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

5. Conditionals###ToDoBack to contents -->Back to contents 6. Functions6.1. BasicsLets use the follo...
  • mysine
  • mysine
  • 2001年07月24日 13:35
  • 606

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

7.2. Dynamic LinkingDynamic Linking is used to link the DLL at runtime.Handling Static and Dynamic L...
  • mysine
  • mysine
  • 2001年07月24日 13:45
  • 576

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

3.6.3. Packed Records (Alignment)If a record is packed (aligned) then the starting byte of a field (...
  • mysine
  • mysine
  • 2001年07月24日 13:33
  • 693

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

8. The Jedi Common Support Unit unit JediUtil;{=====================================================...
  • mysine
  • mysine
  • 2001年07月24日 13:45
  • 530

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

1. Anatomy of a C HeaderBack to contents -->Back to contents ## to do2. Conversion Basics Back to co...
  • mysine
  • mysine
  • 2001年07月24日 13:28
  • 1091

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

. Anatomy of a C HeaderBack to contents -->Back to contents ## to do2. Conversion Basics Back to con...
  • mysine
  • mysine
  • 2001年07月24日 13:24
  • 618

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

3.6. Structures, Records3.6.1. Simple StructuresC structures are similar to records in Delphi. Struc...
  • mysine
  • mysine
  • 2001年07月24日 13:31
  • 571

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

2.3. #defines as constantsC and C++ use #defines in several ways. In a C header file #define can be ...
  • mysine
  • mysine
  • 2001年07月24日 13:28
  • 581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何将C/C++程序转译成Delphi(六)
举报原因:
原因补充:

(最多只允许输入30个字)