获得以下警告:
ttgload.c(1654): warning C4312: 'type cast': conversion from 'FT_UInt' to 'void *' of greater size
这似乎很奇怪。
有问题的代码行是:
if ( FT_List_Find( &loader->composites,
(void*)(unsigned long)glyph_index ) )
和glyph_index
被声明为FT_UInt
。
FT_UInt
为typedef unsigned int
因此将int
转换为void*
是相当奇怪的。
有关如何处理此警告的任何想法?
答案 0 :(得分:0)
FT_UInt是typedef unsigned int,所以将int转换为void *会很奇怪。
实际上并非如此。它非常好,允许在整数和指针之间进行转换。这个的一个特殊应用是一个函数的“用户参数”,你可以在函数中注册整数或指针以及函数回调。
然而,双重类型转换(void*)(unsigned long)
是一个解决问题的方法。不能保证可能导致指针的各种问题(即未定义的行为)的sizeof(unsigned ling) >= sizeof(void*)
被截断。
当有人想要一个也可以容纳指针的整数时使用的正确类型是uintptr_t
和intptr_t
。
有关如何处理此警告的任何想法?
在这种特殊情况下,它可能不是问题的原因,因为该指针将被转换回FT_UInt。从长远来看,提交问题并更改FT_List_Find的原型以接受uintptr_t
而不是指针是有意义的。不幸的是,这也会打破很多现有的计划。