autoconf
[Top][All Lists]
Advanced

[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)



reply via email to

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