【问题标题】:Compile error : cast void * failed in C/C++编译错误:cast void * 在 C/C++ 中失败
【发布时间】:2015-05-20 13:07:07
【问题描述】:

我想编译一个我知道可行的项目。

所以我创建了一个 Makefile 来编译它,但是当我制作它时出现这个错误:

invalid conversion from ‘void*’ to ‘LIMITOR_3DSL_Limitor_32f* {aka LIMITOR_3DSL_Limitor_32f_tag*}’ [-fpermissive]
*ppStatus = ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f));
                                                      ^

真的很奇怪 void* 怎么不能被施放? 编译器会是问题吗?我正在使用 g++

【问题讨论】:

  • 选择一种语言。这是 C 和 C++ 之间的众多差异之一。此外,强制转换和隐式转换是不同的东西。

标签: c++ casting compilation makefile


【解决方案1】:

与 C++ 中的 C 相反,您不能将 void * 类型的指针分配给任何其他类型的指针,因为这样的分配是不安全的。您必须使用 C 或 C++ 形式的转换将指针显式转换为所需的类型。

例如

LIMITOR_3DSL_Limitor_32f *ppStatus = ( LIMITOR_3DSL_Limitor_32f * )ippMalloc( sizeof(LIMITOR_3DSL_Limitor_32f ) );

LIMITOR_3DSL_Limitor_32f *ppStatus = static_cast<LIMITOR_3DSL_Limitor_32f*>( ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f ) ) );

【讨论】:

    【解决方案2】:

    LIMITOR_3DSL_Limitor_32f* ppStatus = (LIMITOR_3DSL_Limitor_32f*)ippMalloc(sizeof(LIMITOR_3DSL_Limitor_32f));

    在 C/C++ 中,我们应该显式地转换类型。 ippMalloc 将返回一个void * 指针,所以我们应该将它从void * 转换为LIMITOR_3DSL_Limitor_32f*

    【讨论】:

    • 这是错误的。禁止在 C 中强制转换 void * (6.3.2.3/1)。在 C++ 中它是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多