The story behind this is that ISO C89 requires that "long" be at least as big
as a pointer (ie. "void *"). The actual requirement is that it be possible to
store a pointer in a standard integer type, and "long" is the largest
standard integer type.
Unfortunately C99 relaxed this requirement, and allowed abominations like the
win64 ABI.
This means you have a choice: Write standard conforming code (long) that works
on all known systems except win64, or use features that do't exist on many
systems. IIRC C99 types like intptr_t are not supported on several fairly
common unix systems.