C++ 编译错误:在C/C+中强制转换void*失败+;
我想编译一个我知道有效的项目 因此,我创建了一个Makefile来编译它,但当我创建它时,出现了以下错误:C++ 编译错误:在C/C+中强制转换void*失败+;,c++,casting,compilation,makefile,C++,Casting,Compilation,Makefile,我想编译一个我知道有效的项目 因此,我创建了一个Makefile来编译它,但当我创建它时,出现了以下错误: invalid conversion from ‘void*’ to ‘LIMITOR_3DSL_Limitor_32f* {aka LIMITOR_3DSL_Limitor_32f_tag*}’ [-fpermissive] *ppStatus = ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f));
invalid conversion from ‘void*’ to ‘LIMITOR_3DSL_Limitor_32f* {aka LIMITOR_3DSL_Limitor_32f_tag*}’ [-fpermissive]
*ppStatus = ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f));
^
真奇怪,一个空洞怎么会不能被铸造?
编译器可能是问题所在吗?我使用的是g++< /p> 在C++中与C相反,你可能不会将一个类型的空洞指针指派给任何其他类型的指针,因为这样的赋值是不安全的。必须使用C或C++的铸造形式将指针显式地转换为所需类型。 比如说
LIMITOR_3DSL_Limitor_32f *ppStatus = ( LIMITOR_3DSL_Limitor_32f * )ippMalloc( sizeof(LIMITOR_3DSL_Limitor_32f ) );
或
LIMITOR_3DSL_LIMITOR_32f*ppStatus=status_cast(ippMalloc(sizeof(LIMITOR_3DSL_LIMITOR_32f));
LIMITOR\u 3DSL\u LIMITOR\u 32f*ppStatus=(LIMITOR\u 3DSL\u LIMITOR\u 32f*)ippMalloc(LIMITOR\u 3DSL\u LIMITOR\u 32f*)代码>
在C/C++中,我们应该显式地强制转换类型。ippMalloc将返回一个void*
指针,因此我们应该将它从void*
强制转换为LIMITOR\u 3DSL\u LIMITOR\u 32f*
选择一种语言。这是C和C++之间的许多差异之一。此外,强制转换和隐式转换是不同的,这是错误的。禁止在C型铸造中使用void*
(6.3.2.3/1)。在C++中是必需的。
LIMITOR_3DSL_Limitor_32f *ppStatus = static_cast<LIMITOR_3DSL_Limitor_32f*>( ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f ) ) );