0

试图将 32 位代码移植到 64 位代码我想知道在移植方面是否有一些标准规则?

我的代码在 64 位环境中编译,现在我遇到了一些错误,例如

从指针转换为不同大小的整数 [-Werror=pointer-to-int-cast] for

x = (int32_t)y;

为此,我使用 x = (size_t)y; 我摆脱了错误,但这是正确的方法。同样在不同的位置,我必须将变量转换为(无符号长长)。例如

printf("Total Time   : %5qu\n",time->compile_time

这给出了一个错误错误:格式 '%qu' 需要类型为 'long long unsigned int' 的参数,但参数 2 的类型为 (XYZ)。

为了解决这个问题,我做了类似的事情

 printf("Total Time   : %5qu\n",(unsigned long long) time->compile_time

这又是正确的吗?

4

2 回答 2

2

我认为在这种情况下假设它y是一个指针是安全的。

而不是size_t你应该使用intptr_tor uintptr_t

请参阅size_t 与 uintptr_t

至于你的第二次演员,这取决于你的意思是正确的?

通常的建议是避免强制转换。然而,就像编程中的所有东西一样,它们可用是有原因的。malloc在嵌入式系统上进行实现时,我必须将指针转换uintptr_t为能够对它们进行必要的算术运算。此代码在 64 位 PC 上测试,但在 32 位微控制器上运行。我使用两种架构的事实是确保它是可移植代码的最佳方式。

但是,强制转换会使您的代码依赖于底层类型的定义方式!就像您注意到x = (int32_t)y这一行使您的代码依赖于指针是 32 位宽的事实一样。

我能给你的唯一建议就是了解你的类型。如果你想强制转换,没关系(只要你不能让你的变量从正确的类型开始),但它可能会降低你的可移植性,除非你选择“正确的”类型来强制转换。

printf演员阵容也是如此。如果我是你,我会%5qu先彻底阅读定义(这可能会有所帮助)。然后我会尝试使用适当类型的变量(或相反的格式字符串),并且只有在失败时我才会求助于强制转换。

我从未使用过%qu,但我会将其解释为64 位无符号整数,因此我会尝试使用uint64_t(因为long long不能保证在所有平台上都是 64 位)。尽管根据我在 Wikipedia 上阅读的内容,q说明符一开始是特定于平台的,因此更改它可能是明智的。

除此之外,问题变得过于广泛(我们坚持具体示例很好)。如果您遇到困难,请返回您想要检查的单个类型并仅询问有关它们的问题。

于 2013-11-06T20:34:44.790 回答
1

是 Stroustrup 说他们称它为“演员表”,因为它支撑着破损的东西吗?;-)

 x = (int32_t) y;

在这种情况下,您使用的是精确宽度类型,因此它实际上取决于 x 和 y 是什么。错误消息表明 y 是一个指针。指针不是 int32_t,所以真正的问题是为什么将 y 分配给 x ...这可能表明存在潜在问题。抛弃它可能只是掩盖问题,以便它在运行时而不是编译时咬你。弄清楚代码认为它在做什么,然后“重新调整”类型以适应代码。当您使用 (size_t) 强制转换时错误消失的原因是指针可能是 64 位而 size_t 是 64 位,但您可以认为这是随机强制转换的一种简单形式。转换为 (unsigned long long) 时也是如此。不要假设一个 int 是 32 位或 64 位,也不要使用强制转换作为移植工具……它会给你带来麻烦。它' 基于单行代码很难更具体。如果您想发布有问题的 < 25 行函数;可能会提供更具体的建议。

于 2013-11-06T20:45:52.373 回答