85

stdint.h と inttypes.h の違いは何ですか?

それらのいずれも使用されていない場合、 uint64_t は認識されませんが、どちらでも定義された型です。

4

2 に答える 2

161

stdint.h

int32_tC99 の指定された幅の整数型 (つまり など)を使用する場合は、このファイルを含めることが「最小要件」ですuint16_t。このファイルをインクルードすると、これらの型の定義が得られるため、変数や関数の宣言でこれらの型を使用したり、これらのデータ型を操作したりできます。

inttypes.h

このファイルをインクルードすると、stdint.h が提供するすべてのものを取得できます(inttypes.h には stdint.h が含まれているため)。ただし、これらの型を使用してand (and 、など) を実行するための機能もポータブルな形式で取得できprintfscanfます。仕方。たとえば、次のようなことができるようにマクロを取得します。fprintffscanfPRIu64printfuint64_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を使用する理由の 1 つprintfは、たとえば、Linux ではなくWindowsであるということuint64_tです。したがって、(inttypes.h ではなく) stdint.h のみをインクルードする場合、上記のコードを記述して Linux と Windows 間の相互互換性を維持するには、次のことを行う必要があります (醜い #ifdef に注意してください)。 :long 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 に答える