[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: exact-width C Integers and Autoconf
From: |
Guido Draheim |
Subject: |
Re: exact-width C Integers and Autoconf |
Date: |
Thu, 21 Feb 2002 18:04:23 +0100 |
Simon,
you contacted me about ac_create_stdint_h.m4 - no success with it?
-- guido
Es schrieb Paul Eggert:
>
> > From: "Simon Waters" <address@hidden>
> > Date: Thu, 21 Feb 2002 02:31:30 -0000
>
> > I need to define 32 and 64 bit integer types in reasonably portable C.
>
> I assume you mean exact-width 32 and 64 bit types. The C standard
> does not require the existence of such types; for example, you might
> be on a 36-bit host that has 36-bit int and 72-bit long. However,
> such machines are admittedly rare these days.
>
> > Linux can include "inttypes.h" these days, so I'm happy to rename to the =
> > "standard" names.
>
> Yes, that's the better way in the long run. The standard names will
> take over eventually.
>
> > Is there an autoconf example to follow?=20
>
> Not that I know of. I would put this into configure.ac:
>
> AC_CHECK_HEADERS(inttypes.h limits.h stdint.h)
>
> and put something like the following into my C code:
>
> #include <config.h>
>
> #if HAVE_LIMITS_H
> # include <limits.h>
> #endif
>
> #if HAVE_INTTYPES_H
> # include <inttypes.h>
> #else
> # if HAVE_STDINT_H
> # include <stdint.h>
> # endif
> #endif
>
> #ifndef INT32_MAX
> # if INT_MAX == 2147483647
> # define int32_t int
> # define INT32_MAX 2147483647
> # else
> # if LONG_MAX == 2147483647
> # define int32_t long
> # define INT32_MAX 2147483647L
> # else
> This code assumes the existence of 32-bit exact-width
> integers, and will not work on machines that lack such a type.
> # endif
> # endif
> #endif
>
> /* Avoids integer overflow on 32-bit hosts. */
> # define EQUALS_INT64_MAX(x) \
> ((x) / 65536 / 65536 == 2147483647 && (x) % 2147483647 == 1)
>
> #ifndef INT64_MAX
> # if EQUALS_INT64_MAX (INT_MAX)
> # define int64_t int
> # define INT64_MAX 9223372036854775807
> # else
> # if EQUALS_INT64_MAX (LONG_MAX)
> # define int64_t long
> # define INT64_MAX 9223372036854775807L
> # else
> # if EQUALS_INT64_MAX (LLONG_MAX)
> # define int64_t long long
> # define INT64_MAX 9223372036854775807LL
> # else
> This code assumes the existence of 64-bit exact-width
> integers, and will not work on machines that lack such a type.
> # endif
> # endif
> # endif
> #endif
>
> Admittedly EQUALS_INT64_MAX is a bit tricky. Perhaps something like
> this should be turned into an autoconf macro, though we probably need
> more experience. I'll CC this message to address@hidden to see if
> there are other opinions.
>
> > This is a multi-part message in MIME format.
>
> Please send text mail as plaintext; it saves me time. Thanks.
-- guido http://freespace.sf.net/guidod
GCS/E/S/P C++/++++$ ULHS L++w- N++@ d(+-) s+a- r+@>+++ y++ 5++X- (geekcode)