我刚刚开始研究一个应该与平台无关的大项目,但它实际上使用了实现定义的类型,例如char
。
这已经导致了一些问题,因为某些设备char
默认为signed
,而其他设备为unsigned
。
我想找到一个解决方案,以避免在必须与平台无关的代码中使用实现定义的类型。
unsigned char
或其他来将所有char变量重新定义为signed char
(或typedef
)?答案 0 :(得分:5)
理论上,答案很简单:
始终将类型用于其预期目的。例如。你想要实现定义类型的类似于数组的大小,因为在不同的平台上,这样大小的上限将是不同的。类似的指针。对于固定大小类型的需求,C已在stdint.h
中提供了适当的typedef
。
这是一个不完整的"什么是使用"列表:
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
提供更多位。答案 1 :(得分:1)
这样做的经典方法是使用您自己的typedefed类型,让make / autoconf等检测平台特性并为您设置typdef。
答案 2 :(得分:0)
这有两种思想流派:
int
和char
这样的“普通”类型,因为你永远无法知道它们有多大。始终使用固定大小的类型,例如<stdint.h>
。int
等”普通“类型,因为它们应始终与您计算机上的本机类型匹配。了解保证的内容并保证不起保证,以便您可以选择合适的内容 - 有时您需要char
,long int
或unsigned int
或其他内容。在绝对需要精确大小类型的那些(希望很少见)场合,使用size_t
中定义的类型。事实证明,这是一个古老的问题,一直有争议,没有人同意答案。