Dan*_*iel 3 c memory type-conversion
我有一个小函数,可以将 32 位架构上的虚拟内存地址转换为物理内存地址:
\nuint32_t VIRTBASE;\n\nuint32_t getPhysForVirt(void* virt) {\n uint32_t offset = (uint8_t*)virt - VIRTBASE;\n return PHYSBASE + offset;\n}\nRun Code Online (Sandbox Code Playgroud)\n在过去 10 多年里,它的编译和运行没有出现任何问题。
\n我更改了编译器来为较新的架构构建存储库(现在首次支持 64 位)。
\n编译失败提示
\n\n\n从 \xe2\x80\x98uint8_t*\xe2\x80\x99 {aka \xe2\x80\x98unsigned char*\xe2\x80\x99} 到 \xe2\x80\x98uint32_t\xe2\x80\x99 {aka \xe2 的无效转换\x80\x98unsigned int\xe2\x80\x99} [-fpermissive]
\n
现在,我理解了该消息,但我不确定使编译没有错误所需的步骤。
\n我只是确定我不想启用 -fpermissive。
\n您使用了错误的类型。C 语言具有用于将指针转换为整数值的特殊类型。
uintptr_t VIRTBASE;
uintptr_t getPhysForVirt(const void * restrict virt) {
ptrdiff_t offset = (uintptr_t)virt - VIRTBASE;
return PHYSBASE + offset;
}
Run Code Online (Sandbox Code Playgroud)
如果其余代码按照这个函数的方式编写 - 那么圣诞节你就有很多工作要做。