uint_least32_t is in stdint.h not in inttypes.h

Vincent Lefevre vincent at vinc17.net
Sun Nov 15 22:22:53 UTC 2020


On 2020-11-15 22:21:18 +0100, Felix von Leitner wrote:
> I was trying to compile gmp with my libc, dietlibc, and got an error
> that uint_least32_t is not defined.
> 
> Well, it is defined, and as far as I can tell in the right header file,
> too: stdint.h.
> 
> However, gmp-impl.h reads as follows:
> 
>  155 #if HAVE_INTTYPES_H      /* for uint_least32_t */
>  156 # include <inttypes.h>
>  157 #else
>  158 # if HAVE_STDINT_H
>  159 #  include <stdint.h>
>  160 # endif
>  161 #endif
> 
> Note that stdint.h is in the else clause. dietlibc has both
> inttypes.h and stdint.h.

But ISO C99 says:

  7.8 Format conversion of integer types <inttypes.h>

  The header <inttypes.h> includes the header <stdint.h> [...]

So, including <inttypes.h> if present should be sufficient, and
this is what the above code does.

That said, for C99 implementations, the #if tests would be useless,
so that the above code is also designed for non-C99 implementations,
which may have <inttypes.h> and <stdint.h> with a behavior different
from C99, i.e. <inttypes.h> will not necessarily include <stdint.h>
(but this also means that <stdint.h> will not necessarily have
uint_least32_t).

> Proposed fix: Move the #if HAVE_STDINT_H outside the previous #if.

Indeed, including both headers independently (when they are available)
may be the best way to have a chance to get uint_least32_t.

-- 
Vincent Lefèvre <vincent at vinc17.net> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)


More information about the gmp-bugs mailing list