将 32 位端口代码移植到 64 位代码
porting 32 bit to 64bit code
正在尝试将 32 位移植到 64 位代码我想知道在移植时是否有一些标准规则?
我在 64 位环境中编译我的代码,现在我遇到了一些错误,例如
从指针强制转换为不同大小的整数 [-Werror=指针到整数转换]
x = (int32_t)y;
为了得到这一点,我使用 x = (size_t)y;我摆脱了错误,但这是正确的方法。同样在不同的位置,我必须将变量转换为(无符号长长)。例如
printf("Total Time : %5qun",time->compile_time
这会产生错误错误:格式"%qu"需要类型为"long long unsigned int"的参数,但参数 2 的类型为 (XYZ)。
为了解决这个问题,我做了类似的事情
printf("Total Time : %5qun",(unsigned long long) time->compile_time
这又合适吗?
安全地假设y
是一个指针。
您应该使用intptr_t
或uintptr_t
而不是size_t
。
请参阅size_t与uintptr_t。
至于你的第二个演员,这取决于你所说的正确是什么意思?
通常的建议是避免铸造。但是,就像编程中的所有内容一样,它们可用是有原因的。在嵌入式系统上实现malloc
时,我必须投射指向uintptr_t
的指针,以便能够对它们进行必要的算术运算。此代码在 64 位 PC 上进行了测试,但在 32 位微控制器上运行。事实上,我使用了两种架构,这是确保它是某种可移植代码的最佳方式。
不过,强制转换会使代码依赖于基础类型的定义方式!就像您在x = (int32_t)y
上注意到的那样,这一行使您的代码依赖于指针为 32 位宽的事实。
我能给你的唯一建议就是了解你的类型。如果要强制转换,可以(只要一开始就不能使变量具有正确的类型),但它可能会降低可移植性,除非您选择要转换为的"正确"类型。
printf
演员阵容也是如此。如果我是你,我会先彻底阅读%5qu
的定义(这可能会有所帮助)。然后我会尝试使用适当类型的变量(或者相反,使用不同的格式字符串),只有当失败时,我才会求助于强制转换。
我从未使用过%qu
但我会将其解释为 64 位无符号 int,所以我会尝试使用 uint64_t
(因为long long
不能保证在所有平台上都是 64 位)。尽管根据我在维基百科上阅读的内容,q
说明符首先是特定于平台的,因此更改它可能是明智的。
除此之外,问题变得过于宽泛(我们坚持使用具体的例子是件好事)。如果您遇到困难,请返回要检查的单个类型,并仅询问有关它们的问题。
Stroustrup说他们称之为"演员",因为它支撑着破碎的东西吗?;-)
x = (int32_t) y;
在这种情况下,您使用的是精确的宽度类型,因此它实际上取决于 x 和 y 是什么。 错误消息表明 y 是一个指针。 指针不是int32_t,所以真正的问题是为什么 y 被分配给 x ...这可能表示存在潜在问题。 丢弃它可能只是掩盖了问题,以便它在运行时而不是编译时咬你。 弄清楚代码认为它在做什么,并"重新跳汰"类型以适应代码。 使用 (size_t) 强制转换时错误消失的原因是指针可能是 64 位,size_t是 64 位,但您可以认为这是一种简单的随机转换运气形式。 投射到(无符号长长)时也是如此。 不要假设 int 是 32 或 64 位,也不要使用强制转换作为移植工具......它会给你带来麻烦。 很难基于一行代码更具体。 如果要发布有问题的<25 行函数;可能提供更具体的建议。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值