Using __attribute((packed))__ on picky architectures

Baurzhan Ismagulov
Sat Jan 17 11:47:00 GMT 2009

On Fri, Jan 16, 2009 at 06:57:57PM +0000, Andrew Haley wrote:
> That's right.  The important thing to realize is that the type of &field2
> in
> 	struct test
> 	{
>     	    UINT8  field1;
>     	    UINT16 field2;
>     	    UINT8  field3;
> 	} __attribute__((__packed__));
> is not UINT16 *; the compiler knows that it's an element of a packed
> struct, and generates code accordingly.  The correct procedure is always
> to pass the address of the whole struct.

I've recently had the need to handle a non-aligned struct member from
two different structures in a somewhat lengthy function. So, two

* Is there anything against implementing packed function arguments (like
  void handle(UINT16 *data __attribute__((packed)))) in gcc? Not that
  I'm going to do that right now :) , but in principle?

* The recommended practice in such cases is to parse the data char by
  char. OTOH, portably casting a struct over a legacy protocol data or
  binary file would save much effort. C99 flexible array members, for
  example, do help. So, why isn't alignment (or, to be more exact,
  packed structures) standardized? Is it "just" difficulty of finding
  "the common denominator" for all platforms out there, or are there any
  more fundamental issues?

Thanks in advance,
Baurzhan Ismagulov

More information about the Gcc-help mailing list