В чем разница между stdint.h и inttypes.h?
Если ни один из них не используется, uint64_t не распознается, но с любым из них это определенный тип.
В чем разница между stdint.h и inttypes.h?
Если ни один из них не используется, uint64_t не распознается, но с любым из них это определенный тип.
См. статью в Википедии для inttypes.h.
Используйте stdint.h для минимального набора определений; используйте inttypes.h, если вам также нужна переносимая поддержка для них в printf, scanf и др.
fatal error: inttypes.h: No such file or directory
- person m4l490n; 16.04.2020
Включение этого файла является минимальным требованием, если вы хотите работать с целочисленными типами указанной ширины C99 (т. е. int32_t
, uint16_t
и т. д.). Если вы включите этот файл, вы получите определения этих типов, так что вы сможете использовать эти типы в объявлениях переменных и функций и выполнять операции с этими типами данных.
Если вы включите этот файл, вы получите все, что предоставляет stdint.h (поскольку inttypes.h включает stdint.h), но вы также получите возможности для выполнения printf
и scanf
> (и fprintf
, fscanf
и т. д.) с этими типами переносимым способом. Например, вы получите макрос PRIu64
, чтобы вы могли printf
uint64_t
вот так:
#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);
}
Одна из причин, по которой вы хотели бы использовать printf
с inttypes.h, заключается, например, в том, что uint64_t
равно long unsigned
в Linux, но long long unsigned
в Windows. Таким образом, если бы вы включили только stdint.h (а не inttypes.h), то, чтобы написать приведенный выше код и сохранить его кросс-совместимость между Linux и Windows, вам пришлось бы сделать следующее (обратите внимание на уродливый #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
}
#include
). По крайней мере, в моей системе Linux (GCC 4.5.2 и подобные).
- person pr1268; 29.08.2012
#include
s stdint.h. - person Mr. Shickadance   schedule 29.09.2011