[英]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.