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

时间:2017-08-25 16:25:20

标签: c char platform-independent

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

这已经导致了一些问题,因为某些设备char默认为signed,而其他设备为unsigned

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

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

3 个答案:

答案 0 :(得分:5)

理论上,答案很简单:

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

这是一个不完整的"什么是使用"列表:

  • 使用(unsignedint表示任何不需要固定大小并且永远不会超出16位范围的整数
  • 在处理在char中存储字符的库函数时,使用int表示字符unsigned char并转换为int
  • 使用size_t表示与对象大小相关的任何内容,例如数组索引
  • 只要您需要将指针的存储在整数中,请使用uintptr_t
  • 使用intX_t / uintX_tX是位数)对于任何需要固定位数的整数,根据目标不应该改变平台。
  • 如果类型的大小实际上是否更大并不重要,请改用int_leastX_t / uint_leastX_t。无法解决八位字节的实现不会提供例如八位字节。 uint8_t,但uint_least8_t提供更多位。

答案 1 :(得分:1)

这样做的经典方法是使用您自己的typedefed类型,让make / autoconf等检测平台特性并为您设置typdef。

答案 2 :(得分:0)

这有两种思想流派:

  1. 永远不要使用像intchar这样的“普通”类型,因为你永远无法知道它们有多大。始终使用固定大小的类型,例如<stdint.h>
  2. 中定义的类型
  3. 尽可能使用“{1}}和int等”普通“类型,因为它们应始终与您计算机上的本机类型匹配。了解保证的内容并保证不起保证,以便您可以选择合适的内容 - 有时您需要charlong intunsigned int或其他内容。在绝对需要精确大小类型的那些(希望很少见)场合,使用size_t中定义的类型。
  4. 事实证明,这是一个古老的问题,一直有争议,没有人同意答案。