разница между stdint.h и inttypes.h

В чем разница между stdint.h и inttypes.h?

Если ни один из них не используется, uint64_t не распознается, но с любым из них это определенный тип.


person mahmood    schedule 29.09.2011    source источник
comment
inttypes.h #includes stdint.h.   -  person Mr. Shickadance    schedule 29.09.2011


Ответы (2)


См. статью в Википедии для inttypes.h.

Используйте stdint.h для минимального набора определений; используйте inttypes.h, если вам также нужна переносимая поддержка для них в printf, scanf и др.

person Ed Staub    schedule 29.09.2011
comment
Я пришел в stackoverflow, чтобы узнать разницу между stdint.h и inttypes.h после прочтения вики-статьи, в которой говорится, что (u)intN_t доступен в обоих. Так в чем же разница? Что я должен включить? - person dave; 15.08.2012
comment
‹inttypes.h› включает ‹stdint.h› и добавляет некоторые макросы printf. См. Ответ Микко Остлунда ниже. - person Edward Falk; 10.06.2016
comment
Я получаю: fatal error: inttypes.h: No such file or directory - person m4l490n; 16.04.2020

stdint.h

Включение этого файла является минимальным требованием, если вы хотите работать с целочисленными типами указанной ширины C99 (т. е. int32_t, uint16_t и т. д.). Если вы включите этот файл, вы получите определения этих типов, так что вы сможете использовать эти типы в объявлениях переменных и функций и выполнять операции с этими типами данных.

inttypes.h

Если вы включите этот файл, вы получите все, что предоставляет 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
}
person Mikko Östlund    schedule 06.02.2012
comment
Спасибо, это был отличный ответ (хотя я не задавал исходный вопрос!). Чтобы добавить к ответу Микко, inttypes.h копируется в stdint.h (через препроцессор #include). По крайней мере, в моей системе Linux (GCC 4.5.2 и подобные). - person pr1268; 29.08.2012