今天一朋友问到我这么一个函数,感觉很怪异,看是什么意思:
inline void (*cast_to_fptr(void *p))()
{
union{
void *p;
void (*f)();
}u;
u.p = p;
return u.f;
}
看起来是挺怪异,其实改造一下就很明显了:
typedef void(*function_t)();
inline function_t cast_to_fptr( void* p)
{
union{
void *p;
function_t f;
}u;
u.p = p;
return u.f;
}
其实它就是为了把void*类型强制转换成一个类型指针,这样做会避免编译器出现警告,提高程序的可移植性。显然改造后可读性会好些,一看就知道是一个返回值为一个函数指针的函数。在QGIS的头文件里有这样的注释: // hack to workaround warnings when casting void pointers // retrieved from QLibrary::resolve to function pointers. // It’s assumed that this works on all systems supporting
其实,也不需要那么复杂,直接进行强制类型转在GCC和VC中都没有警告:
inline function_t cast_to_fptr( void* p) { return (function_t)p; }