compiling on solaris 9
skaller
skaller at users.sourceforge.net
Sat Sep 15 13:17:47 EDT 2007
On Sat, 2007-09-15 at 15:42 +0200, Sven Panne wrote:
> On Saturday 15 September 2007 13:58, skaller wrote:
> > [...]
> > 1. Measure the size (and alignment, while at it) of all the
> > integer types. (trial execute and run).
> > [...]
> > 4. For the ones provided, AND size_t, ptrdiff_t, check
> > their size (and signedness). (trial execution)
>
> Small additional note: One can determine the size and alignment *without*
> always resorting to trial execution. Autoconf does this by an
> ingenious "evaluation by compilation" technique in case of cross-compilation,
> see the implementation of AC_CHECK_SIZEOF and AC_CHECK_ALIGNOF.
Hmm .. I guess that's possible with some kind of type checking
hack? .. (I don't use autoconf but thanks for that info .. I will
have a look, it would be cool to get better cross-compilation
support).
> > [...]
> > 6. Test what the typedefs found are actually aliased to
> > using C++ (there is no other portable way to do this).
> > (Trial execution)
>
> To be honest, I don't understand that point...
The point is that on most systems knowing the size of
say 'intptr_t' does NOT tell you which integer type it
is aliased to if there are two of them, eg:
// gcc, amd64, Linux:
sizeof(intptr_t) == 8
sizeof(long) == 8
sizeof(long long)== 8
sizeof(int)=4
so intptr_t is aliased to long or long long .. which one?
Short of examining the header file source code, the only
way to find out is in C++ with overloading:
void me(long){ printf("long"); }
void me(long long) { printf("long long"); }
me( (intptr_t)0 );
Unfortunately EVERY system I know of has at least one more integer
type available than actual integer sizes: on Win64 int and long have
the same size, and of course long long must be used for the
"integer the size of a pointer".
This is what bit the Ocaml library.. if you need such an animal
it MUST be called 'my_intptr_t', since no other name is standard
than one you define yourself.
Yeah, this is a REAL pain .. but look at any 'professional'
C library (OpenGL, GMP, etc etc) and they all do it.
BTW: in C, it usually doesn't matter which of two integers types
of the same size you use .. but in C++ it does, precisely because
it affects overloading. But note C99 has 'overloading' of a kind,
and consider using "C++ safe" C when possible, I think it is worth
ensuring 'my_intptr_t' aliases the same type as 'intptr_t' if the
latter is defined.
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
More information about the Glasgow-haskell-users
mailing list