我正在开展一个学校项目,涉及在实验性硬件上移植大量的C代码.不幸的是,该硬件是64位的,并且代码包含许多指针算术实例,它们要求指针为32位,即它经常执行reinterpret_cast< uint32_t>(ptr).
逐一浏览它们将是非常乏味的,因为无论如何这是一个实验项目,我很乐意接受“hackish”解决方法.所以我修改了malloc的实现,以确保它永远不会分配超过4GB限制的内存.从技术上讲,这些演员应该是有效的.
问题是,如何向Clang解释这个?我得到的错误是:错误:从指针转换为较小的类型’uint32_t'(又名’unsigned int’)丢失信息.有没有办法禁用它?
谢谢,
大卫
解决方法
我同意你应该咬紧牙关并修复代码以使用正确的整数类型.但要回答你的问题:不,你不能禁用它,虽然你可以解决它.
许多错误来自警告.一般来说这是一件好事,但如果你想禁用警告,那就去做吧.由于罪魁祸首可能是-Wall,它可以保留许多警告,你应该选择性地禁用这个警告.该错误消息提到负责错误消息的诊断,例如,… [-Wextra-tokens](如果没有,则删除-fno-diagnostics-show-option标志).然后,您可以通过添加-Wno-extra-tokens完全禁用此诊断(再次,“额外令牌”警告是一个示例),或通过-Wno-error = extra-tokens将其转换为非致命警告.
但是,这个特定的错误不是由于警告,我找不到任何禁用错误的选项(有道理,因为大多数错误是致命的).
但是为了截断整数值而不必修复uint32_t的所有错误用法,你可以使用static_cast< uint32_t>(reinterpret_cast< uintptr_t>(ptr)).毋庸置疑,这仍然是错误的.