Mail Archives: djgpp/2003/03/18/22:45:03
I've read conflicting information regarding the #pragma pack directive.
Unless I'm missing a compile option, it appears not to work to pad
struct elements to a known width.
As a side note, I read a post where someone said something such
as "padding hurts portability". I think this is just the opposite; If you
can control the size of structs, especially with binary I/O ACROSS
multiple platforms, you enhance portability, instead of being left at
the padding mercy of each machine (provided of course that your
data can be read on the most restrictive of the target machines...
a 32-bit int that uses all 32-bits most certainly cannot be read into
a 16-bit int regardless of padding; however, a int that uses 16-bits
can be padded to 32 and will be readable on both 16-bit and 32-bit
machines).
In any case, I was surprised to see the output from this small test
program and was wondering if perhaps I'm doing something wrong.
If DJGPP (and other gcc's) don't support the #pragma pack( x )
directive, it surprises me that they would be silent about it and not
toss out a warning.
I threw in an obviously wrong pragma and the compiler rightfully
caught it:
warning: ignoring #pragma foo
But it seemed quite happy with the pragma's in the code below;
it just didn't act on them. Is there a compile option (I cannot find
one) that would enable the pragma's in the following code?
=============================================
#include <stdio.h>
#pragma pack (1)
struct A {
char x;
char y;
};
#pragma pack (2)
struct B {
char x;
char y;
};
#pragma pack (4)
struct C {
char x;
char y;
};
#pragma pack (8)
struct D {
char x;
char y;
};
int main( void ) {
printf( "sizeof A = %d\n", sizeof(struct A) );
printf( "sizeof B = %d\n", sizeof(struct B) );
printf( "sizeof C = %d\n", sizeof(struct C) );
printf( "sizeof D = %d\n", sizeof(struct D) );
return 0;
}
=============================================
As I said, the output surprised me:
sizeof A = 2
sizeof B = 2
sizeof C = 2
sizeof D = 2
From what I've read, I can use the __attribute__ options to force memory
alignment which will probably have the desired effect, although I somehow
think that packing and actual boundary alignment can be different in some
cases [I need to sit and think about that though].
Any thoughts or help?
Dan
- Raw text -