\r
#pragma pack(1)\r
\r
+//\r
+// !!! For a structure with a series of bit fields and used as a storage in vfr file, and if the bit fields do not add up to the size of the defined type.\r
+// In the C code use sizeof() to get the size the strucure, the results may vary form the compiler(VS,GCC...).\r
+// But the size of the storage calculated by VfrCompiler is fixed (calculate with alignment).\r
+// To avoid above case, we need to make the total bit width in the structure aligned with the size of the defined type for these bit fields. We can:\r
+// 1. Add bit field (with/without name) with remianing with for padding.\r
+// 2. Add unnamed bit field with 0 for padding, the amount of padding is determined by the alignment characteristics of the members of the structure.\r
+//\r
typedef struct {\r
UINT16 NestByteField;\r
UINT8 : 1; // unamed field can be used for padding\r
UINT8 Match2;\r
UINT8 GetDefaultValueFromCallBackForOrderedList[3];\r
UINT8 BitCheckbox : 1;\r
+ UINT8 ReservedBits: 7; // Reserved bit fields for padding.\r
UINT16 BitOneof : 6;\r
+ UINT16 : 0; // Width 0 used to force alignment.\r
UINT16 BitNumeric : 12;\r
MY_BITS_DATA MyBitData;\r
MY_EFI_UNION_DATA MyUnionData;\r
UINT32 EfiBitNumeric : 4;\r
UINT32 EfiBitOneof : 10;\r
UINT32 EfiBitCheckbox : 1;\r
+ UINT32 : 0; // Width 0 used to force alignment.\r
} MY_EFI_BITS_VARSTORE_DATA;\r
\r
//\r