Unterschied zwischen stdint.h und inttypes.h

77

Was ist der Unterschied zwischen stdint.h und inttypes.h?

Wenn keiner von ihnen verwendet wird, wird uint64_t nicht erkannt, aber bei beiden handelt es sich um einen definierten Typ.

Mahmood
quelle
3
inttypes.h #includes stdint.h.
Herr Shickadance

Antworten:

24

Siehe den Wikipedia-Artikel für inttypes.h.

Verwenden Sie stdint.h für einen minimalen Satz von Definitionen. Verwenden Sie inttypes.h, wenn Sie auch tragbare Unterstützung für diese in printf, scanf usw. benötigen.

Ed Staub
quelle
24
Ich bin zu stackoverflow gekommen, um den Unterschied zwischen stdint.h und inttypes.h zu erfahren, nachdem ich den Wiki-Artikel gelesen habe, der mir sagt, dass (u) intN_t in beiden verfügbar ist. Was ist der Unterschied? Welches soll ich einschließen?
Dave
7
<inttypes.h> enthält <stdint.h> und fügt einige printf-Makros hinzu. Siehe Mikko Östlunds Antwort unten.
Edward Falk
Ich bekomme:fatal error: inttypes.h: No such file or directory
m4l490n
150

stdint.h

Das Einschließen dieser Datei ist die "Mindestanforderung", wenn Sie mit den Integer-Typen mit der angegebenen Breite von C99 (dh "int32_t", "uint16_t" usw.) arbeiten möchten. Wenn Sie diese Datei einschließen, erhalten Sie die Definitionen dieser Typen , sodass Sie diese Typen in Deklarationen von Variablen und Funktionen verwenden und Operationen mit diesen Datentypen ausführen können.

inttypes.h

Wenn Sie diese Datei einschließen, erhalten Sie alles, was stdint.h bietet (da inttypes.h stdint.h enthält), aber Sie erhalten auch Funktionen zum Ausführen von printf und scanf (und "fprintf", "fscanf" usw.). ) mit diesen Typen auf tragbare Weise. Beispielsweise erhalten Sie das Makro "PRIu16", damit Sie eine Ganzzahl uint16_t wie folgt drucken können:

#include <stdio.h>
#include <inttypes.h>
int main (int argc, char *argv[]) {

    // Only requires stdint.h to compile:
    uint16_t myvar = 65535;

    // Requires inttypes.h to compile:
    printf("myvar=%" PRIu16 "\n", myvar);  
}
Mikko Östlund
quelle
5
Danke, das war eine großartige Antwort (obwohl ich die ursprüngliche Frage nicht gestellt habe!). Um Mikkos Antwort zu ergänzen, kopiert inttypes.h in stdint.h (über den Präprozessor #include). Zumindest auf meinem Linux-System (GCC 4.5.2 und ähnlich).
pr1268