得到以下警告:
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*
。
有关如何处理此警告的任何想法?
FT_UInt是typedef unsigned int,因此将int转换为void *是很奇怪的。
其实不是。很好,可以在整数和指针之间进行转换。此功能的一个特殊应用是对函数的“用户参数”,在该函数中,您将整数或指针与函数回调一起注册。
但是,双重打字(void*)(unsigned long)
是解决问题的良方。不能保证sizeof(unsigned ling) >= sizeof(void*)
可能导致指针出现各种问题(即未定义的行为)的指针被截断。
当某人想要一个也可以容纳指针的整数时,可以使用的正确类型是uintptr_t
and intptr_t
。
有关如何处理此警告的任何想法?
在这种特殊情况下,它可能不是问题的根源,因为该指针将被投射回FT_UInt。从长远来看,提出一个问题并更改FT_List_Find的原型以接受auintptr_t
而不是指针是有意义的。不幸的是,这也会破坏许多现有程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句