尝试将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
这又是否合适?
答案 0 :(得分:2)
我认为在这种情况下假设y
是指针是安全的。
而不是size_t
,您应该使用intptr_t
或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行功能有问题;可能会提供更具体的建议。