希望するコードは次のとおりです。
#if (typeid(std::uint32_t) == typeid(unsigned long))
typedef unsigned long Integer32;
#else
typedef std::uint32_t Integer32;
それは合法ではありませんが、あなたが言おうとしているのは、言い換えれば、「をuint32_t意味する場合はunsigned longをInteger32意味しunsigned longます。そうでなければ、それは何uint32_tを意味するかを意味します」ということです。
これは次と同等です:
typedef std::uint32_t Integer32;
どちらの場合もInteger32、意味する同じタイプをuint32_t意味するようにエイリアシングしているためです。だからそれを書いてください。
uint32_t準拠する実装では、 が符号なし 32 ビット型であることが保証されています。それunsigned longはあなたの実装にないので、ほぼ確実unsigned intです。これら 2 つの型unsigned longとunsigned intは、同じサイズであっても異なる型です。対照的に、uint32_tは typedef であるため、typedef が意味するものと同じ型です。
新しい質問に答えるには:
typedef unsigned short Integer16;
unsigned short正確に 16 ビットではない可能性があります (ただし、そうでない実装はあまりありません)。正確な 16 ビットの符号なしタイプが必要な場合は、それuint16_tが目的です。これはオプションの型であるため、適切な型を持たない実装では、コードは有益なエラーになります。
typedef std::uint32_t Integer32;
uint32_tOK、オプションのタイプの警告付き。この名前Integer32を使用したい場合は、自由に使用してください。
typedef unsigned int FastInteger16;
少なくとも 16 ビットの高速符号なし整数が必要な場合std::uint_fast16_tは、ではなく使用します。unsigned int
typedef unsigned long FastInteger32;
少なくとも 32 ビットの高速符号なし整数が必要な場合std::uint_fast32_tは、ではなく使用します。unsigned long