繁体   English   中英

在C程序中使用C ++库

[英]Using C++ Library within C program

我试图在一个单独的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文件中的所有函数前面,现在它们都编译了。 所以,感谢大家的帮助!

如果我是你,我将使用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-它

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

您可能想要更仔细地检查参数/返回值/强制转换的const

例如,如果对象本身不是const ,那么GetHandle应该返回void * ,而不是const void * 同样,如果getInt是一个const函数,那么GetInt正确获得一个const void * 但是,它也应该将它转换为const Object * ,而不是Object *

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

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

暂无
暂无

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

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