希望するコードは次のとおりです。
#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_t
OK、オプションのタイプの警告付き。この名前Integer32
を使用したい場合は、自由に使用してください。
typedef unsigned int FastInteger16;
少なくとも 16 ビットの高速符号なし整数が必要な場合std::uint_fast16_t
は、ではなく使用します。unsigned int
typedef unsigned long FastInteger32;
少なくとも 32 ビットの高速符号なし整数が必要な場合std::uint_fast32_t
は、ではなく使用します。unsigned long