错误 C2040:"我的类":"void *"的间接级别与"我的类"不同
error C2040: 'MyClass' : 'void *' differs in levels of indirection from 'MyClass'
我写了一个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);
}
此代码可以在调试模式下与Visual Studio和LabVIEW一起运行。没有错误发生。
现在我明白问题了:第一个我实际上只能创建对象MyClass,我做where调用createWrapper函数(双精度a,双精度b)(因此对象被创建)。在此之前一切正常。例如,如果我调用这个函数:
extern "C"__declspec (dllexport) double Add(void *instance, double a, double b)
{
MyClass *myClass = static_cast<MyClass*>(instance);
return myClass->Add(a, b);
}
如何告诉我的对象(指针)"我的类"使已知在LabVIEW这个功能?
或者更确切地说,我如何反对指针"void * instance"引用。例如,如果我编写一个测试程序(c++),我将按照如下步骤进行:
int main ()
{
void * testref;
testref = create (1.2);
Add (testref, 5.6);
......
}
这是在c++中,但在Labview中。我怎么能得到这个对象"void * teststref "为所有剩余的函数使用。
Sorry for my english
您的typedef
正在破坏您的代码。你不需要它。类型定义导致编译器在看到new MyClass
时感到困惑,因为您已将MyClass
重新定义为void*
。
- 删除
typedef void* MyClass
行 - 将
createWrapper
函数的签名更改为void* createWrapper
- 将
extern "C"
添加到createWrapper
函数定义,而不仅仅是其声明。
如果你正在开发一个C API,它是一个对象方法的平面表示,考虑采用oop风格的命名约定("Noun_Verb
"名称而不是使用VerbNoun
名称),因为当检查代码中的所有函数列表时,它们将更有组织。
另外,不要忘记定义一个delete
函数,否则会释放您的对象实例:
extern "C" void* MyClass_create() {
return new MyClass();
}
extern "C" void MyClass_destroy(void* instance) {
delete static_cast<MyClass*>(instance);
}
我推荐阅读这个QA以获得更多信息和大量有用的示例:如何从C调用c++方法?
我也怀疑你使用DLLIMPORT
不正确,因为我相信你实际上是导出这些函数。我觉得直接使用__declspec
而不是使用宏更好。语法是__declspec(dllexport)
,见这里:https://msdn.microsoft.com/en-us/library/a90k134d.aspx
- 我希望定义两个具有相同代码的不同名称的库
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 为什么我的输出与输入不同?(C++)
- 为什么我的字符* 复印机返回不同的东西?
- 如何将不同大小的数组传递给我的 C++ 函数?
- 是否可以将不同的编译器嵌入到我的应用程序中?
- fftw:为什么我的 2D DFT 输出与每行的 1D DFT 输出不同?
- 我的代码在不同的平台上给出不同的输出
- 为什么在我的程序中输入另一个输入会给我不同的结果
- 为什么Visual Studio会以不同的方式对待我的对象
- C++问题,我的两个源代码应该具有相同的输出,但它们是不同的
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- 为什么我的代码为同一代码生成不同的值
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 如果输入变量的数据类型与以前不同,如何使我的循环仍然正常运行?
- 我可以让我的本地C 编译器与Linux环境中的编译器不同吗?
- 在不同条件下无法访问我的向量变量
- C 给我2个基本计算的不同答案
- 如何让我的CSV文件读取器读取C 中的不同类型
- 我的不同线程是否会看到更新后的shared_ptr对象