最佳实践:我应该在C或C++中为byte创建typedef吗?

Dan*_*n O 18 c c++ pointers typedef

你喜欢看t_byte*(像typedef unsigned char t_byte)或unsigned char*代码吗?

我倾向于t_byte我自己的图书馆,但从未参与过采用这种方法的大型项目,我对这些陷阱感到疑惑.

War*_*ung 21

如果您使用的是C99或更新版本,则应使用stdint.h此功能. uint8_t, 在这种情况下.

在C++ 11调用它之前,C++没有得到这个标题cstdint.旧版本的Visual C++不允许您stdint.h在C++代码中使用C99 ,但几乎所有其他C++ 98编译器都使用C99 ,因此即使使用旧编译器也可以使用该选项.

正如许多其他事情一样,Boost就这种差异提出了论文boost/integer.hpp,提供了诸如uint8_t编译器的标准C++库之类的东西.


Cli*_*ord 7

我建议如果您的编译器支持它,请使用C99 <stdint.h>标头类型,如uint8_tint8_t.

如果您的编译器不支持它,请创建一个.这是VC++ 一个例子,其旧版本没有stdint.h. 海湾合作委员会确实支持stdint.h,实际上大多数是C99

您的建议的一个问题是标识char是实现定义的,因此如果您确实创建了类型别名.你应该至少明确一下这个标志.这个想法有一些优点,因为在C#中例如a char是16位.但它也有一个字节类型.


附加说明......

您的建议没有问题,实际上您确实指定了未签名.

我还建议char如果数据实际上是字符数据则使用plain ,即可以显示在控制台上的纯文本表示.使用标准库和第三方库时,这将减少类型协议问题.另一方面,如果数据表示非字符实体(如位图),或者如果它是数字'小整数'数据,您可以在其上执行算术操作,或者您将执行逻辑操作的数据,则其中一个stdint.h应该使用类型(甚至是从其中一个定义的类型).

我最近遇到了TI C54xx编译器,char其实际上是16位,所以这就是为什么在可能的情况下使用stdint.h,即使你使用它然后定义一个byte类型,最好假设它unsigned char是一个合适的别名.