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.
Mahmud
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.
Mikko Östlund
Das Einschließen dieser Datei ist die “Mindestanforderung”, wenn Sie mit den Integer-Typen von C99 mit angegebener Breite arbeiten möchten (dh int32_t
, uint16_t
etc.). Wenn Sie diese Datei einschließen, werden Sie erhalten die Definitionen dieser Typensodass Sie diese Typen in Deklarationen von Variablen und Funktionen verwenden und Operationen mit diesen Datentypen ausführen können.
Wenn Sie diese Datei einschließen, werden Sie erhält alles, was stdint.h bereitstellt (weil inttypes.h stdint.h enthält), aber Sie wird auch Einrichtungen zum Tun bekommen printf
und scanf
(und fprintf
, fscanf
, usw.) mit diesen Typen auf portable Weise. Sie erhalten zum Beispiel die PRIu64
Makro, damit Sie können printf
a uint64_t
so was:
#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);
}
Ein Grund, den Sie verwenden möchten printf
mit inttypes.h ist das zB so uint64_t
ist long unsigned
unter Linux aber long long unsigned
unter Windows. Wenn Sie also nur stdint.h (nicht inttypes.h) einschließen würden, müssten Sie Folgendes tun, um den obigen Code zu schreiben und ihn zwischen Linux und Windows kompatibel zu halten (beachten Sie das hässliche #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
}
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
29. August 2012 um 2:02 Uhr
Ed Staub
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 portable Unterstützung für diese in printf, scanf usw. benötigen.
Ich bin zu stackoverflow gekommen, um den Unterschied zwischen stdint.h und inttypes.h zu lernen nach Lesen Sie den Wiki-Artikel, der mir sagt, dass (u)intN_t in beiden verfügbar ist. Was ist also der Unterschied? Welche soll ich einschließen?
– dave
15. August 2012 um 6:04 Uhr
– Eduard Falk
10. Juni 2016 um 20:52 Uhr
Ich bekomme: fatal error: inttypes.h: No such file or directory
– m4l490n
15. April 2020 um 22:15 Uhr
@ m4l490n Verwenden Sie -std=c99
?
– Nayuki
14. September 2021 um 2:05 Uhr
inttypes.h
#include
s stdint.h.– Herr Schickadance
29. September 2011 um 12:56 Uhr