gpt4 book ai didi

c++ - 错误 C2040 : 'MyClass' : 'void *' differs in levels of indirection from 'MyClass'

转载 作者:行者123 更新时间:2023-11-30 03:49:19 24 4
gpt4 key购买 nike

我写了一个DLL(C++)的C_Wrapper。头文件

#define DLLIMPORT __declspec (dllexport)
#ifdef __cplusplus
extern "C" {
#endif
typedef void* MyClass;
DLLIMPORT MyClass* createWrapper(double a, double b);
#ifdef __cplusplus
}
#endif

源文件:

#include "stdafx.h"
#include "MyClass.h"
#include "C_DllWrapper.h"

DLLIMPORT MyClass* createWrapper(double a, double b)
{
return new MyClass(a,b);
}

我收到以下错误消息:错误 C2040:“MyClass”:“void *”与“MyClass”的间接级别不同


我改变了我的 C_Wrapper:

头文件:

#ifdef __cplusplus
#endif

extern "C"__declspec (dllexport) void* createWrapper(double a, double b);
extern "C"__declspec (dllexport) void destoryWrapper(void* instance);
extern "C"__declspec (dllexport) double Add(void* instance, double a, double b);

#ifdef __cplusplus
#endif

源文件:

#include "stdafx.h"
#include "MyClass.h"
#include "C_DllWrapper.h"

extern "C"__declspec (dllexport) void* createWrapper(double a, double b)
{
return new MyClass(a,b);
}

extern "C"__declspec (dllexport) void destoryWrapper(void *instance)
{
delete static_cast<MyClass*>(instance);
}
extern "C"__declspec (dllexport) double Add(void *instance, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(instance);
return myClass->Add(a, b);
}

是这样吗?


什么更好?

extern "C"__declspec (dllexport) void* createWrapper(double a, double b)
{
return new MyClass(a,b);
}

extern "C"__declspec (dllexport) void destoryWrapper(void *instance)
{
delete static_cast<MyClass*>(instance);
}
extern "C"__declspec (dllexport) double Add(void *instance, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(instance);
return myClass->Add(a, b);
}

或者那个:

extern "C"__declspec (dllexport) void* createWrapper(double a, double b)
{
return new MyClass(a,b);
}

extern "C"__declspec (dllexport) void destoryWrapper(void *instance)
{
delete static_cast<MyClass*>(instance);
}
extern "C"__declspec (dllexport) double Add(void *instance, double a, double b)
{
MyClass *myClass = reinterpret_cast<MyClass*>(instance);
return myClass->Add(a, b);
}

我可以在 Debug模式下使用 Visual Studio 和 LabVIEW 运行此代码。没有发生错误。

现在我明白了问题:我拥有的第一个实际上只能创建对象 MyClass,我在哪里做调用 createWrapper 函数(double a,double b)(因此创建了对象)。到这里为止一切正常。例如,如果我调用这个函数:

  extern "C"__declspec (dllexport) double Add(void *instance, double a,   double b)
{
MyClass *myClass = static_cast<MyClass*>(instance);
return myClass->Add(a, b);
}

我怎样才能让我的对象(指针)“MyClass”在 LabVIEW 中为这个函数所知?

或者更确切地说,我如何反对引用的指针“void * instance”。比如我写一个测试程序(C++),我会按如下方式进行:

 int main ()
{
void * testref;
testref = create (1.2);
Add (testref, 5.6);
......
}

这是在 C++ 中,但在 Labview 中。我怎样才能得到这个对象“void * testref”以供所有剩余的函数使用。

对不起我的英语

最佳答案

您的 typedef 正在破坏您的代码。你不需要它。 typedef 导致编译器在看到 new MyClass 时感到困惑,因为您已将 MyClass 重新定义为 void*

  1. 删除 typedef void* MyClass 行。
  2. createWrapper 函数的签名更改为 void* createWrapper
  3. extern "C" 添加到 createWrapper 函数定义中,而不仅仅是它的声明。

如果您开发的 C API 是对象方法的平面表示,请考虑采用 OOP 式命名约定(“Noun_Verb”名称,而不是使用 VerbNoun 名称),因为在检查代码中所有函数的列表时它们会更有条理。

此外,不要忘记定义一个删除或以其他方式释放您的对象实例的函数:

extern "C" void* MyClass_create() {
return new MyClass();
}

extern "C" void MyClass_destroy(void* instance) {
delete static_cast<MyClass*>(instance);
}

我建议阅读此 QA 以获取更多信息和大量有用的示例:How to call a C++ method from C?

我还怀疑您错误地使用了 DLLIMPORT,因为我相信您实际上是在导出这些函数。我觉得直接使用 __declspec 比使用宏更好。语法为 __declspec(dllexport),请参见此处:https://msdn.microsoft.com/en-us/library/a90k134d.aspx

关于c++ - 错误 C2040 : 'MyClass' : 'void *' differs in levels of indirection from 'MyClass' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32623362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com