【问题标题】:call c function in c++在c++中调用c函数
【发布时间】:2013-09-16 07:50:20
【问题描述】:

我尝试创建一个包装类来将c函数lmdif1包装在库cminpack

class CSolver
{
public:
    void solve()
    {
        ...
        using namespace std::placeholders;
    auto f = std::bind(&CSolver::fcn, this, _1, _2, _3, _4, _5, _6);
        int32_t iRet = lmdif1(f, 0, m_iEqualCount, m_iUnknownVariableCount, x, fvec, tol, iwa, wa, lwa);
    }
private:
    int32_t fcn(void* p, int32_t m, int32_t n, const double* x, double* fvec,int iFlag)
    {
    ....
    }
};

编译错误:

error: cannot convert ‘std::_Bind<std::_Mem_fn<int (CSolver::*)(void*, int, int, const double*, double*, int)>(CSolver*, std::_Placeholder<1>, std::_Placeholder<2>, std::_Placeholder<3>, std::_Placeholder<4>, std::_Placeholder<5>, std::_Placeholder<6>)>’ to ‘cminpack_func_mn {aka int (*)(void*, int, int, const double*, double*, int)}’ for argument ‘1’ to ‘int lmdif1(cminpack_func_mn, void*, int, int, double*, double*, double, int*, double*, int)’
         int32_t iRet = lmdif1(f, 0, m_iEqualCount, m_iUnknownVariableCount, x, fvec, tol, iwa, wa, lwa);

我该如何解决?

编辑:所以我将使用一个全局函数。谢谢大家。

【问题讨论】:

  • 您将 C++ 对象传递给 C 函数。 C 函数根本不知道“对象”是什么,也无法使用它。
  • 那么唯一的办法就是创建一个全局函数?
  • @JoachimPileborg:您如何可移植地提供static 成员函数extern "C" 链接?我意识到不会使用损坏的名称,调用约定可能会有所不同(尽管实际上它们不会)。
  • @JoachimPileborg,不,这是无效的,回调接受类型为“指向extern "C" 函数的指针”的参数并且指针extern "C++" 函数(例如静态成员函数)不是可转换为指向extern "C" 函数的指针(尽管许多编译器都接受它)
  • @JoachimPileborg:正如我在上一条评论中所说:调用约定可以不同:传递extern "C++" 函数指针而不是预期extern "C" 指针保证可以工作,尽管我不知道有任何系统出现故障。

标签: c++ c c++11 compatibility calling-convention


【解决方案1】:

您不能获取成员函数的函数指针。它必须是一个类函数。类函数在 C++ 中使用 static 关键字声明。所以你要做的就是把fcn的原型改成:

static int32_t fcn (void *p, int32_t m, int32_t n, const double *x, 
   double *fvec, int iFlag)

当然,您将无法从 fcn 中访问任何非静态成员变量。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2013-05-14
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多