difference between stdint.h and inttypes.h
Asked Answered
G

2

100

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.

Gurias answered 29/9, 2011 at 12:2 Comment(1)
inttypes.h #includes stdint.h.Ptolemaeus
E
32

See the wikipedia article for inttypes.h.

Use stdint.h for a minimal set of definitions; use inttypes.h if you also need portable support for these in printf, scanf, et al.

Elielia answered 29/9, 2011 at 12:6 Comment(4)
I came to stackoverflow to learn the difference between stdint.h and inttypes.h after reading the wiki article which tells me that (u)intN_t is available in both. So what is the difference? Which should I include?Peaslee
<inttypes.h> includes <stdint.h> and adds some printf macros. See Mikko Östlund's answer below.Chromyl
I get: fatal error: inttypes.h: No such file or directoryAlltime
@Alltime Are you using -std=c99?Lottielotto
J
183

stdint.h

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.

inttypes.h

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
}
Juryman answered 6/2, 2012 at 15:0 Comment(1)
Thanks, that was a great answer (even though I didn't ask the original question!). To add to Mikko's answer, inttypes.h copies in stdint.h (via preprocessor #include). At least on my Linux system (GCC 4.5.2 and similar).Claypool
E
32

See the wikipedia article for inttypes.h.

Use stdint.h for a minimal set of definitions; use inttypes.h if you also need portable support for these in printf, scanf, et al.

Elielia answered 29/9, 2011 at 12:6 Comment(4)
I came to stackoverflow to learn the difference between stdint.h and inttypes.h after reading the wiki article which tells me that (u)intN_t is available in both. So what is the difference? Which should I include?Peaslee
<inttypes.h> includes <stdint.h> and adds some printf macros. See Mikko Östlund's answer below.Chromyl
I get: fatal error: inttypes.h: No such file or directoryAlltime
@Alltime Are you using -std=c99?Lottielotto

© 2022 - 2024 — McMap. All rights reserved.