dav*_*dil 8 c++ pointers compiler-errors clang
我正在开展一个学校项目,涉及在实验性硬件上移植大量的C++代码.不幸的是,该硬件是64位,并且代码包含许多指针算法实例,它们需要指针为32位,即它经常这样做reinterpret_cast<uint32_t>(ptr).
逐一浏览它们将是非常繁琐的,因为无论如何这是一个实验项目,我很乐意接受"hackish"解决方案.所以我修改了malloc的实现,以确保它永远不会分配超过4GB限制的内存.从技术上讲,这些演员应该是有效的.
问题是,如何向Clang解释这个?我得到的错误是:error: cast from pointer to smaller type 'uint32_t' (aka 'unsigned int') loses information.有没有办法禁用它?
谢谢,大卫
小智 7
我同意你应该咬紧牙关并修复代码以使用正确的整数类型.但要回答你的问题:不,你不能禁用它,虽然你可以解决它.
许多错误来自警告.一般来说这是一件好事,但是如果你想禁用警告,那就去做吧.由于罪魁祸首可能-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)).不用说,这仍然是错误的.
-fms-extensions从Cpplang Slack的某人那里获得此功能后,我可以禁用此功能:
看着“ DiagnosticSemaKinds.td”,它显示为
err_bad_reinterpret_cast_small_int,https: //github.com/llvm-mirror/clang/blob/release_50/include/clang/Basic/DiagnosticSemaKinds.td#L6193在“ SemaCast.cpp中有两次发生”-其中之一表明它对MS扩展敏感,https://github.com/llvm-mirror/clang/blob/release_50/lib/Sema/SemaCast.cpp#L2112 一个人可以尝试-fms-extensions(希望不是-fms-compatibility),但是会带来所有的shebang。