繁体   English   中英

没有typedef的函数指针如何转换?

[英]How to do a function pointer cast without a typedef?

我正在使用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();

两个问题:

  1. 哪种C ++强制转换适合而不是类似C的强制转换? 静态还是重新解释?

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

哪种C ++强制转换适合而不是类似C的强制转换? 静态还是重新解释?

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

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

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

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

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

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

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

这样做的另一种方法是使用联合。

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

//...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM