避免在平台无关代码中实现定义的类型

Nic*_*ick 6 c char platform-independent

我刚刚开始研究一个应该与平台无关的大项目,但它实际上使用了实现定义的类型,例如char.

这已经造成了一些问题,因为某些设备char默认signed为其他设备unsigned.

我想找到一个解决方案,以避免在必须与平台无关的代码中使用实现定义的类型.

  1. 什么是最好的解决方案?使用编译器参数(例如:-funsigned-char),s或其他将所有char变量重新定义为unsigned char(或signed char)typedef
  2. 如果标准是签名还是未签名,是否还有其他类型的标准?

小智 5

从理论上讲,答案很简单:

始终将类型用于其预期目的.例如,您希望实现定义的类型类似于数组的大小,因为在不同的平台上,这样大小的上限将是不同的.类似的指针.对于固定大小类型的需要,C已经提供了适当的typedefs stdint.h.

这是一个不完整的"使用对象"列表:

  • Use(unsigned)int表示任何不需要固定大小且不会超过16位范围的整数
  • 使用char的文字,int并投射到unsigned char与字符存储在库函数打交道时int.
  • 使用size_t了相关的对象,例如数组索引的大小事情
  • 使用uintptr_t时,你需要将存储指针的整数
  • 对于任何需要固定位数的整数,请使用intX_t/ uintX_t(以X位数为单位),这些位不应根据目标平台而改变.
  • 如果类型的大小实际上是否更大并不重要,请使用int_leastX_t/ uint_leastX_t代替.无法解决八位字节的实现不会提供例如uint8_t,但它提供uint_least8_t更多位.