1

我正在尝试在单独的 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 的无知在这里体现出来。我习惯了用于 dsPIC 的 Microchip C30,这有点不同。

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

4

3 回答 3

1

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

不过,您可能需要const更仔细地检查您的参数/返回值/强制类型转换。

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

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

于 2012-08-09T11:53:52.197 回答
1

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

于 2012-08-09T11:54:05.467 回答
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-它

于 2012-08-09T11:51:39.493 回答