【问题标题】:How to do a function pointer cast without a typedef?如何在没有 typedef 的情况下进行函数指针转换?
【发布时间】:2015-06-28 10:52:31
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 关于第 2 点并保持 C 风格,我会假设 (cBase * (_cdecl (*))( void )) 或只是 (cBase * (_cdecl *)( void ))

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


【解决方案1】:

哪种 C++ 类型转换更适合代替 C 类类型转换?静态还是重新解释?

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    另一种方法是使用联合。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 2021-09-17
      • 2022-12-31
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多