What is the difference between stdint.h and inttypes.h?
If none of them is used, uint64_t is not recognized but with either of them it is a defined type.
The purpose of <inttypes. h> is to provide a set of integer types whose definitions are consistent across machines and independent of operating systems and other implementation idiosyncrasies. It defines, via typedef, integer types of various sizes.
The inttypes. h file is a C header file that is part of the C standard library and API.
Including this file is the "minimum requirement" if you want to work with the specified-width integer types of C99 (i.e. int32_t
, uint16_t
etc.). If you include this file, you will get the definitions of these types, so that you will be able to use these types in declarations of variables and functions and do operations with these datatypes.
If you include this file, you will get everything that stdint.h provides (because inttypes.h includes stdint.h), but you will also get facilities for doing printf
and scanf
(and fprintf
, fscanf
, and so on.) with these types in a portable way. For example, you will get the PRIu64
macro so that you can printf
a uint64_t
like this:
#include <stdio.h> #include <inttypes.h> int main (int argc, char *argv[]) { // Only requires stdint.h to compile: uint64_t myvar = UINT64_C(0) - UINT64_C(1); // Requires inttypes.h to compile: printf("myvar=%" PRIu64 "\n", myvar); }
One reason you would want to use printf
with inttypes.h is, for example, that uint64_t
is long unsigned
in Linux but long long unsigned
in Windows. Thus, if you were to only include stdint.h (not inttypes.h), then, to write the above code and keep it cross-compatible between Linux and Windows, you would have to do the following (notice the ugly #ifdef):
#include <stdio.h> #include <stdint.h> int main (int argc, char *argv[]) { // Only requires stdint.h to compile: uint64_t myvar = UINT64_C(0) - UINT64_C(1); // Not recommended. // Requires different cases for different operating systems, // because 'PRIu64' macro is unavailable (only available // if inttypes.h is #include:d). #ifdef __linux__ printf("myvar=%lu\n", myvar); #elif _WIN32 printf("myvar=%llu\n", myvar); #endif }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With