autoconf
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: AC_CHECK_ALIGNOF maximum ??


From: 'Chris Hall'
Subject: RE: AC_CHECK_ALIGNOF maximum ??
Date: Thu, 20 Jun 2013 19:53:16 +0100

Nick Bowler wrote (on Thu 20-Jun-2013 at 19:06 +0100):
> On 2013-06-20 10:51 -0700, Russ Allbery wrote:
> > Nick Bowler <address@hidden> writes:
> > > C11 also provides max_align_t, which is *probably* what you are
> > > looking for but obviously isn't available everywhere.  Anyway,
> > > on older implementations without max_align_t, the following
> > > type is probably a "good enough" substitute for it:
> > >
> > >   union {
> > >     char a;
> > >     short b;
> > >     int c;
> > >     long d;
> > >     long long e;
> > >     float f;
> > >     double g;
> > >     long double h;
> > >     void *i;
> > >   }

> > I would add a function pointer, but yes.

> Good idea.

Hmmm.  Up to a point...

...I confess this approach makes me feel more than a little queasy.  I
checked the C99 standard and the above appears to cover all the types
mentioned in 6.2.5... except for _Bool (!).  I note that the _Complex
types are defined to have the same alignment as the corresponding
floats.  Similarly unsigned integers are defined to align the same as
the corresponding signed ones.  There's wchar_t, size_t, intptr_t, ...
which I suppose one is justified in supposing are the same as one of
the ordinary integers.  But then there are the "implementation defined
extended integer types"... which aren't on the list, of course --
uint256_t, anybody ?  (I cannot spot anything in the standard which
says that long long is definitely bigger than long, or that it
definitely has a larger alignment... similarly long double etc...
otherwise the list could be shortened somewhat.)

...I cannot help feeling that this would be wonderfully portable,
except where it wasn't -- and in the second of these cases you'd be in
it up to your neck, without warning.
 
Actually, for what I am trying to do, I have decided to fake
alignof().  It takes a bit of dicking-about, but it occurred to me
that alignof(foo_t) may be constructed as offsetof(struct { char x;
foo_t q; }, q)... Sadly gcc throws an unhelpful (in this case)
warning... which requires some scrubbing around :-(

Thanks,

Chris




reply via email to

[Prev in Thread] Current Thread [Next in Thread]