在C程序中使用C ++库

时间:2012-08-09 11:35:17

标签: c++ c initialization

我试图在一个单独的C程序中使用一些用C ++编写的软件。

我已经在.lib文件中编译了必要的组件,并使用

包含了一些C代码
#ifdef __cplusplus
    extern "C" {
#endif

这段代码包含C调用函数中的C ++对象方法调用。对象在文件范围内声明,并且最初检索到指向对象的指针,然后用于引用调用方法的对象。例如:

const void *GetHandle() {
    return (void *) &obj;
}

然后调用方法:

int GetInt(const void *handle) {
    Object *temp = (Object *) handle;
    return temp->getInt();
}

这是解决问题的有效方法吗?目前,只有我的C程序中的GetHandle()方法,当我尝试将它们的返回值分配给某些const void *变量时,我得到错误“错误C2099:初始化程序不是常量”。


修改

修正了问题。我对标准C的无知在这里有所体现。我习惯于将Microchip C30用于dsPIC,这有点不同。

我试图在任何函数之外声明和初始化指针。我确实将它们设置为const,但这不是必需的,所以我现在只是声明外部然后在init函数中初始化。我也把extern“C”放在cpp文件中的所有函数前面,现在它们都编译了。所以,感谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

如果我是你,我会使用COM对象来包装所有C ++功能,请查看此代码项目演示:

http://www.codeproject.com/Articles/13601/COM-in-plain-C

如果您不熟悉COM对象,我想您可以先阅读本文 http://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It

答案 1 :(得分:1)

这是一个有效的解决方案。

您可能希望更仔细地检查参数的const /返回值/转换。

例如,如果对象本身不是const,那么GetHandle应该返回void *,而不是const void *。同样,如果getIntconst函数,则GetInt正确获得const void *。但是,它也应该将其投放到const Object *,而不是Object *

为了进一步诊断,您应该提供您得到initializer is not a constant错误的确切行(以及调用该函数的上下文)。我的猜测是,错误与代码的其他部分有关,使用这些错误的强制转换值。

答案 2 :(得分:1)

您的代码有错误:您隐式将const void * handle强制转换为非const Object *。 您的方法是正确的 - 您应该将所有包装函数定义为extern“C”以强制进行C风格的链接,并且您也不要忘记异常 - 您应该在包装器中捕获它们以防止它们通过C堆栈。