我正在使用ACE从动态加载的DLL获取功能。下面的功能symbol()返回一个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();

两个问题:
  • 哪种C++强制转换适合而不是类似C的强制转换?静态还是重新解释?
  • 我可以在 Actor 表中省略typedef吗?正确的语法是什么?我不希望它在使用我的DLL的任何地方都可见。由于我只在代码中的少数地方需要它,因此我想删除typedef。
  • 最佳答案



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



    如果您拥有可用的正确类型的指针,则可以指定指针的类型,而不是类型名称:

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

    或者您可以从强制转换表达式中推断出指针类型:
    auto pfunc = reinterpret_cast<cBase*(_cdecl *)()>(...);
    

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

    10-01 23:53