delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难。
经过查找资料,原来delphi可以通过{$Z+} {$Z-} {$Z1} {$Z4} 等宏设置枚举类型的长度,小至1个字节,大至4个字节。
官方说明如下:
The $Z directive controls the minimum storage size of Delphi enumerated types.
An enumerated type is stored as an unsigned byte if the enumeration has no more than 256 values, and if the type was declared in the {$Z1} state (the default). If an enumerated type has more than 256 values, or if the type was declared in the {$Z2} state, it is stored as an unsigned word. Finally, if an enumerated type is declared in the {$Z4} state, it is stored as an unsigned double word.
The {$Z2} and {$Z4} states are useful for interfacing with C and C++ libraries, which usually represent enumerated types as words or double words.
Note: Note: For backwards compatibility with early versions of Delphi and CodeGear Pascal, the directives {$Z-} and {$Z+} are also supported. They correspond to {$Z1} and {$Z4}, respectively.
例子如下:
Example code : Various enum type sizes |
type {$Z1} TCars1 = (Rover, Jaguar, Honda); // Will fit into 1 byte TFruit1 = (Banana=255, Apple, Pear); // Will exceed one byte {$Z4} TCars2 = (Ford, Nissan, Vauxhall); // Now uses 4 bytes TFruit2 = (Orange=255, Plum, Grape); // Now uses 4 bytes begin ShowMessage('TCars1 size = '+IntToStr(SizeOf(TCars1))); ShowMessage('TFruit1 size = '+IntToStr(SizeOf(TFruit1))); ShowMessage('TCars2 size = '+IntToStr(SizeOf(TCars2))); ShowMessage('TFruit2 size = '+IntToStr(SizeOf(TFruit2))); end; |
TCars1 size = 1 TFruit1 size = 2 TCars2 size = 4 TFruit2 size = 4 |
相关推荐
设备的名称通常可以通过查询`SPDRP_FRIENDLYNAME`属性得到,而端口号可能需要查询其他属性,比如`SPDRP_PORT_NAME`,具体取决于设备类型。 ```delphi var DeviceProperty: TGuid; PropertyType: DWORD; Property...
**2.1.4 枚举类型的最小尺寸(Minimum Enum Size)** - **功能描述**:指定为枚举类型分配的最小内存大小。可以选择字节(`{$Z1}`)、双字节(`{$Z2}`)或四字节(`{$Z4}`)。 - **示例**:如果选择`{$Z2}`, 枚举类型将至少...
7. 枚举类型: - Delphi中的枚举(enumeration)是命名的整数常量集合。 - C++的枚举(enum)类似,但C++11引入了更强类型的enum class,增强了类型安全性。 8. 结构体和联合: - Delphi中的记录(record)类似...
在Delphi中,结构体可以包含各种基本类型、其他结构体或枚举等。例如,我们可以定义一个包含整型、字符串和浮点数的结构体: ```delphi type TMyStruct = record IntValue: Integer; StrValue: String; ...
这里值得注意的是,由于 `Font.Style` 是一个枚举类型,因此需要将其转换为整型数据才能被正确地写入到 INI 文件中。 ##### 步骤四:读取 INI 文件 ```delphi procedure TForm1.Button2Click(Sender: TObject); ...
- 常量和枚举值全大写,用下划线分隔单词(如`MAX_SIZE`)。 - 单元名采用小写字母,如果需要分隔单词,使用下划线(如`my_unit`)。 2. **注释** - 为每个类、方法、函数提供清晰的多行注释,解释其功能和使用...
- 常量和枚举项全大写,单词间用下划线分隔,如`MAX_SIZE`。 - 单元名遵循PascalCase,如`MyUnit`。 2. **注释** - 注释应简洁明了,描述代码的功能和目的,避免过多的细节。 - 使用`{}`包围单行注释,多行注释...
1. 定义一个类型,用于存储进程和模块的信息,例如: ```delphi TProcessModuleInfo = record ProcessID: DWORD; ModuleName: string; ModuleBaseAddress: Pointer; ModuleSize: DWORD; ModuleHandle: ...
- `type SysUtils.TLanguages` —— 定义了语言环境的枚举或集合类型。 --- #### 二、`function AllocMem(Size: Cardinal): Pointer;` **功能:** 动态分配指定大小的内存。此函数用于创建一块指定大小的内存区域...
// 使用KnownColor枚举类型填充ComboBox comboBox1.DataSource = Enum.GetNames(typeof(KnownColor)); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); // 遍历ComboBox的所有项目 ...
在Delphi中,该函数通常会传入服务控制管理器句柄、服务类型和服务状态,以及一个缓冲区用于接收服务信息。 ```delphi function EnumServicesStatus(hSCManager: SC_HANDLE; dwServiceType: DWORD; dwServiceState...