25.4.11 Packing Objects
The __pack
specifier can be used to indicate that structures should not use memory gaps to align structure members, or that individual structure members should not be aligned.
Use the native keywords discussed in the Differences section to look up information on the semantics of this specifier.
Some compilers cannot pad structures with alignment gaps for some devices, and use of this specifier for such devices is ignored.
Example
__pack
, as well as a structure
where one member has been explicitly
packed.struct DATAPOINT {
unsigned char type;
int value;
} __pack x_point;
struct LINETYPE {
unsigned char type;
__pack int start;
long total;
} line;
Differences
The __pack
specifier is a new CCI specifier that can be used with PIC devices
and MPLAB XC8. This specifier has no observable effect since the device memory is byte
addressable for all data objects. When targeting AVR devices, the MPLAB XC8 compiler has
used the packed
attribute.
The MPLAB XC16, XC-DSC, and XC32 compilers have used the packed
attribute to
indicate that a structure member was not aligned with a memory gap.
Migration to the CCI
packed
attribute to the __packed
specifier, for
example, from:struct DOT
{
char a;
int x[2] __attribute__ ((packed));
};
tostruct DOT
{
char a;
__pack int x[2];
};
Alternatively, you can pack the entire structure, if required.Caveats
None.