返回值为CC++函数指针的函数

    技术2022-05-20  30

    今天一朋友问到我这么一个函数,感觉很怪异,看是什么意思:

    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; }

    最新回复(0)