我应该使用cstdint吗?

我一直在思考我是否应该使用<cstdint>的typedef。

我个人比较喜欢把uint32_t写在unsigned intint8_t上,因为它对我来说更直观。

你们有什么感想? 使用来自<cstdint>的types定义是不是一个好主意? 有什么缺点吗?

其实,我会build议使用两者。

如果你想要的东西是32位无符号的,使用uint32_t。 例如,如果您正在实现一个“结构”来表示一个外部对象,其规范将其中一个字段定义为32位无符号。

如果你想要的东西是“机器的自然字大小”,请使用int或unsigned int。 例如:

 for (int i = 0 ; i < 200 ; ++i) // stuff 

“机器的自然字大小”将会为您提供最好的性能,无论是在今天的处理器还是未来的处理器上。

如果你的意思是“字符”,使用“char”; “char”或“unsigned char”,如果你的意思是“字节”。 C / C ++允许你通过“char *”来访问一个任意对象的字节,而不是其他任何东西。

如果您特别需要8位整数,请使用uint8_t或int8_t,类似于uint32_t。

你应该使用两者。 当你需要一个“合理大小”的整数时,你应该使用int ,正如其他答案中所解释的那样。 当你需要一个字符时使用char :它是自我logging。

在与外部世界进行二进制接口时,您应该使用uint32_t和friends:在进行networking编程,处理二进制文件或使用外部多字节编码等。在这些情况下,types的确切大小对于正确写入,自我logging代码。 这就是<stdint.h> (或C ++ 0x <cstdint> )的用途。

(Endianness同样重要,但完全是另一回事。)

这取决于variables的目的。

如果你需要一个循环计数器,使用int 。 如果您需要一个string,请使用char数组。

如果你需要一个可以保持-1到100的数字variables, int8_t是好的。 如果你需要表示一个从0到100,000的值,那么uint32_t uint_least32_t (谢谢@Serge)是一个很好的select。

需要使用cstdint中的typedef的一个特殊情况是在处理执行大量指针到int转换的代码时,在这种情况下,使用intptr_t是绝对需要的。

在我工作的公司,我们正在准备从32位移植到64位吨的低质量的C / C ++代码,这些代码保持投影指针为int,然后返回指针,这在64位架构上肯定会失败,所以我们尝试尽可能地清理代码(即修改数据结构和接口以除去完全转换的需要),并在其他地方使用intptr_t而不是int。

在一个侧面说明:一般来说,投射应该引起怀疑,但是认真地说,指向整数的指针几乎总是devise中某个严重缺陷的结果。 基本上,每当你隐藏一个int后面的指针时,你就是在向编译器,平台,更重要的是你的同事说谎。

除此之外,像其他人所说的那样:尽可能使用genericstypes,并在需要时使用显式大小的types。

你基本上似乎没有uint32_t和unsigned int之间的任何线索。 这是非常正常的,因为你不一定知道你的types将在以后使用。

只需使用typedef。

无论你需要一个unsigned int还是一个uint32_t(你可以稍后想想,当你对程序有更完整的了解时),使用typedef可以帮助你更清楚地指明你的代码操纵,如果你在最初的select是最糟糕的一个月之后find几个月的话,它会使它更容易转换成另一种types。 这里没有一个“正确的答案”,因为你通常把这些事情弄得一团糟。 一些想要uint32_t的图书馆和其他一些想要图书的图书馆之间的互操作是痛苦的。

尽可能使用template和通用编程。 不要依赖任何types,如果你不必!

如果你有一个函数需要一个数字,并返回它乘以2,写这样的:

 template <typename Number> inline Number doubleNum(Number n) { return 2*n; } 

甚至这个:

 template <typename RetType, typename NumberType> inline RetType doubleNum(NumberType n) { return 2*n; } 

这样,如果你有一个使用int s的库, double s, uint64_t s – 你的名字 – 你可以使用它,而不用重写你的代码。 如果您需要使用二进制文件或networking编程,则可以使用固定大小的types,而不必重写代码。 如果你需要任意的精确数字,你可以使用一个类,它通过运算符重载(比如GMP包装器)实现与原始整数或浮点types相同的接口, 而不用重写代码

你可以专门化模板化的函数或类,来优化特定的情况,或者使用不符合相关接口的类(或C struct ):

 /* * optimization: * primitive integers can be bit-shifted left to * achieve multiplication by powers of 2 * (note that any decent compiler will do this * for you, behind the hood.) */ template <> inline int doubleNum<int>(int n) { return n<<1; } /* * optimization: * use assembly code */ template <> inline int32_t doubleNum<int32_t>(int32_t n) { asm { ... } } /* * work with awkward number class */ template <> inline AwkwardNumber doubleNum<AwkwardNumber>(AwkwardNumber n) { n.multiplyBy(2); return n; }