我试图在一个单独的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文件中的所有函数前面,现在它们都编译了。所以,感谢大家的帮助!
答案 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 *
。同样,如果getInt
是const
函数,则GetInt
正确获得const void *
。但是,它也应该将其投放到const Object *
,而不是Object *
。
为了进一步诊断,您应该提供您得到initializer is not a constant
错误的确切行(以及调用该函数的上下文)。我的猜测是,错误与代码的其他部分有关,使用这些错误的强制转换值。
答案 2 :(得分:1)
您的代码有错误:您隐式将const void * handle强制转换为非const Object *。 您的方法是正确的 - 您应该将所有包装函数定义为extern“C”以强制进行C风格的链接,并且您也不要忘记异常 - 您应该在包装器中捕获它们以防止它们通过C堆栈。