0

好的,我正在尝试在 WFSExecute 下编写此代码,但如果我键入:

WFSPINGETDATA * pingetdata = lpCmdData;

我收到一个错误:

errorC2440:“正在初始化”:无法从“LPVOID”转换为“WFSPINGETDATA *”

如果我注释掉那一行,应用程序就会执行。

另外,如果我写:

((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;

我收到一个错误:

errorC2440:“=”无法从“void”转换为“LPWFSPINKEY *”

有什么办法可以解决这个问题吗?

4

1 回答 1

2

C++ 在类型安全方面比 C 更严格。在这种情况下,void*当分配给 other 以外的任何东西时,必须进行类型转换void*

WFSPINGETDATA * pingetdata = lpCmdData;

无法从“LPVOID”转换为“WFSPINGETDATA *”

这意味着lpCmdData是 a void*,因此需要进行类型转换:

WFSPINGETDATA * pingetdata = (WFSPINGETDATA*) lpCmdData;

或者,使用 C++ 风格的转换而不是 C 风格的转换:

WFSPINGETDATA * pingetdata = static_cast<WFSPINGETDATA*>(lpCmdData);
((WFSPINDATA*) (temp)) ->lpPinKeys = malloc(sizeof(LPWFSPINKEY)*NumberOfKeys) ;

无法从“void”转换为“LPWFSPINKEY *”

malloc()返回 a void*,因此这里也需要类型转换:

((WFSPINDATA*) (temp)) ->lpPinKeys = (LPWFSPINKEY*) malloc(sizeof(LPWFSPINKEY)*NumberOfKeys);

或者,使用 C++ 风格的强制转换:

static_cast<WFSPINDATA*>(temp)->lpPinKeys = static_cast<LPWFSPINKEY*>(malloc(sizeof(LPWFSPINKEY)*NumberOfKeys));

或者,使用 C++ 风格的分配而不是 C 风格的分配:

static_cast<WFSPINDATA*>(temp)->lpPinKeys = new LPWFSPINKEY[NumberOfKeys];
// must use 'delete[] lpPinKeys' instead of 'free(lpPinKeys)' to deallocate the memory
于 2016-01-08T06:37:10.343 回答