У чому різниця між stdint.h та inttypes.h?
Якщо жоден з них не використовується, uint64_t не розпізнається, але для будь-якого з них це визначений тип.
Відповіді:
Дивіться статтю Вікіпедії для inttypes.h.
Використовуйте stdint.h для мінімального набору визначень; використовуйте inttypes.h, якщо вам також потрібна портативна підтримка для них у printf, scanf та ін.
fatal error: inttypes.h: No such file or directory
У тому числі і цей файл є «мінімальним вимогою» , якщо ви хочете працювати із заданою шириною цілих типів 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 , а uint64_t
це long long unsigned
в Windows. Отже, якщо ви повинні написати вищезазначений код і зберегти його перехресну сумісність між Linux і Windows, ви зробите наступне:
#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);
// Requires different cases for different operating systems
#ifdef __linux__
printf("myvar=%lu\n", myvar);
#elif _WIN32
printf("myvar=%llu\n", myvar);
#endif
}
#include
). Принаймні в моїй системі Linux (GCC 4.5.2 та подібні).
#include
s stdint.h .