在C ++中定义类型安全“字节”(如8位)类型的最现代和惯用的方法是什么?

时间:2012-11-09 16:25:25

标签: c++ types type-safety

我想在我的C ++程序中定义一个byte类型,基本上是unsigned char什么是最惯用的方法呢?

我想定义一个byte类型来抽象出不同的表示形式,并且可以创建由{{1}支持的这种新byte(8位)类型的类型安全数组。对于一个位操作库,我正在研究我正在创建的程序的一个非常具体的用例。我希望它非常显式这是一个特定于我的程序域的8位字节,并且不受基于平台或编译器的不同实现的影响。

4 个答案:

答案 0 :(得分:4)

charunsigned charsigned char都是一个字节; std::uint8_t(来自<cstdint>)是一个8位字节(也存在一个带符号的变体)。最后一个仅存在于具有8位字节的系统上。还有std::uint_least8_t(来自相同的标题),至少 8位和std::uint_fast8_t,它至少有8位,应该是最有效的一位

答案 1 :(得分:2)

最常用的方法是使用signed charunsigned char。你可以使用typedef来调用它byte,或者如果你需要强类型,你可以使用BOOST_STRONG_TYPEDEF。

如果您需要它恰好是8位,则可以使用uint8_t中的<cstdint>,但不保证在所有平台上都存在。

答案 2 :(得分:2)

老实说,这对我来说是C ++中最令人恼火的“功能”之一。

是的,您可以使用std::uint8_tunsigned char,在大多数系统上,前者将是后者的typedef

但是......这不是类型安全的,因为typedef不会创建新类型。而且委员会拒绝在标准中添加“强类型”。

考虑

void foo (std::uint8_t);
void foo (unsigned char); // ups...

答案 3 :(得分:1)

我目前正在使用uint8_t方法。我看到它的方式是,如果一个平台没有8位类型(在这种情况下我的代码将无法在该平台上运行),那么我不希望它继续运行,因为我最终会出乎意料行为是由于我在假设它是8位的情况下处理数据,而实际上并非如此。所以我不明白为什么你应该使用unsigned char,假设它是8位,然后根据该假设执行所有计算。我认为这只是一个问题。