85

stdint.h 和 inttypes.h 有什么区别?

如果没有使用它们,则无法识别 uint64_t,但对于它们中的任何一个,它都是已定义的类型。

4

2 回答 2

161

标准字符集

如果您想使用 C99 的指定宽度整数类型(即int32_tuint16_t等),包含此文件是“最低要求”。如果包含此文件,您将获得这些类型的定义,以便您能够在变量和函数的声明中使用这些类型,并对这些数据类型进行操作。

整数类型.h

如果包含此文件,您将获得 stdint.h 提供的所有内容(因为 inttypes.h 包含 stdint.h),但您还将获得在可移植文件中使用这些类型执行printfscanf(和fprintf、、fscanf等等)的工具方式。例如,您将获得PRIu64宏,以便您可以printfuint64_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);  
}

您希望与 inttypes.h 一起使用的一个原因是printf,例如,在 Linux 中但在 Windows 中。因此,如果您只包含 stdint.h(而不是 inttypes.h),那么,要编写上述代码并使其在 Linux 和 Windows 之间保持交叉兼容,您必须执行以下操作(注意丑陋的 #ifdef) :uint64_tlong unsignedlong long unsigned

#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
}
于 2012-02-06T15:00:40.927 回答
27

有关 inttypes.h,请参阅维基百科文章。

将 stdint.h 用于最小的定义集;如果您还需要在 printf、scanf 等中对这些提供便携式支持,请使用 inttypes.h。

于 2011-09-29T12:06:22.630 回答