Best practice in C to support 64-bit or 32-bit address length with same source file ?

Ken Raeburn raeburn at raeburn.org
Sun May 4 15:13:30 UTC 2008


On May 3, 2008, at 19:03, Jay Estabrook wrote:
>   Modern C on most machines now establishes:
>
>    sizeof(long integer) == sizeof(pointer)
>
>   so if you MUST live with a program in which is is common to go
>   back and forth between something declared "int" and a pointer,
>   changing the variable declared "int" to "long" often will do the
>   trick.

Not all systems do that, though.  On 64-bit Windows, for example,  
sizeof(int)==sizeof(long)<sizeof(void*).  I don't have any UNIX  
examples to point to offhand, but I don't think this is a safe  
assumption to make in general.

If you want to mix pointers and integral types like that, I'd say look  
for "intptr_t", which should be defined on any system that's up to  
fairly current C standards.

Another area where I've occasionally seen problems is assuming "int"  
and "long" are the same when using pointers, or that "long" can be  
used when you need a type that's exactly 32 bits.  If you have a long*  
in one place, and elsewhere you have an int* or a pointer to an array  
of four bytes, and you ignore the compiler warnings (or don't require  
that function prototypes be visible at call sites), the code  
indirecting through the pointer can use more or fewer bytes than were  
really being provided.  So: Turn on compiler warnings for missing  
prototypes and pointer type mismatches, and fix those warnings.

Ken




More information about the axp-list mailing list