移植32位到64位代码

时间:2013-11-06 20:30:08

标签: c++ c porting

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

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

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

x = (int32_t)y;

为了得到这个,我使用x =(size_t)y;我摆脱了错误,但这是正确的方法。同样在不同的位置我必须将变量强制转换为(unsigned long long)。例如

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

这又是否合适?

2 个答案:

答案 0 :(得分:2)

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

而不是size_t,您应该使用intptr_tuintptr_t

请参阅size_t vs. uintptr_t

至于你的第二次演员,取决于你的意思是什么?

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

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

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

同样适用于printf演员表。如果我是你,我会首先彻底阅读%5qu的定义(this may help)。然后我会尝试使用一个适当类型的变量(或者相反地使用不同的格式字符串),并且只有在失败的情况下才能使用强制转换。

我从未使用%qu,但我会将其解释为 64位unsigned int ,因此我会尝试使用uint64_t(因为long long不能保证在所有平台上都是64位)。虽然我在维基百科上读到的q说明符是特定于平台的,所以改变它可能是明智的。

除此之外,问题变得过于宽泛(我们坚持特定的例子是好的)。如果您遇到困难,请返回您要检查的各种类型,并仅询问有关它们的问题。

答案 1 :(得分: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行功能有问题;可能会提供更具体的建议。