如何在没有typedef的情况下执行函数指针转换?

时间:2015-04-21 10:23:35

标签: c++ casting function-pointers typedef ace

我正在使用ACE从动态加载的DLL中获取函数。下面的函数符号()返回一个void指针,我必须将其转换回原来的位置。

typedef cBase * (_cdecl *typeCreateManager)( void );

// ...

ACE_DLL * m_pAceDll = new ACE_DLL;
m_pAceDll->open( "NameOfDll.dll" );

cBase * (_cdecl *pfunc)( void ); // declaration of function pointer
// can be replaced by "typeCreateManager pfunc;"

pfunc = (typeCreateManager)m_pAceDll->symbol("?createManager@@YAPAVcBase@@XZ");
// can be replaced by ???

cBase * pObject = (*pfunc)();

m_pAceDll->close();

两个问题:

  1. 哪个C ++演员代替C-like演员?静态还是重新解释?

  2. 我可以省略演员表中的typedef吗?什么是正确的语法?我不希望它在我的DLL被使用的任何地方都可见。由于我只需要代码中的少数几个地方,我想删除typedef。

2 个答案:

答案 0 :(得分:4)

  

哪种C ++演员适合而不是类似C演员?静态还是重新解释?

您需要reinterpret_cast将对象指针(包括void*)转换为函数指针。

  

我可以在演员表中省略typedef吗?

如果你有一个可用的正确类型的指针,你可以指定指针的类型,而不是类型名称:

cBase * (_cdecl * pfunc)();
pfunc = reinterpret_cast<decltype(pfunc)>(...);

或者您可以从强制转换表达式中推断出指针类型:

auto pfunc = reinterpret_cast<cBase*(_cdecl *)()>(...);

但是您需要在某处指定函数类型,并且对于强制转换和变量声明使用合适的typedef可能会更清晰且更不容易出错。

答案 1 :(得分:2)

另一种方法是使用工会。

union{
    void *data;
    cBase* (*pfunc)(void);
}converter;

//...

converter.data = m_pAceDll->symbol("?createManager@@YAPAVcBase@@XZ");
cBase *base = converter.pfunc();