如何将 void* 转换为 foo* 以符合 C++?

Posted

技术标签:

【中文标题】如何将 void* 转换为 foo* 以符合 C++?【英文标题】:How to convert void* to foo* to comply with C++? 【发布时间】:2015-04-01 08:47:49 【问题描述】:

我正在尝试编译用 C 编写的代码(nDPI 库附带的 ndpiReader.c 程序,托管 here)。我正在使用 Qt Creator 和 GCC 编译器。

在做了一些研究here 和here 之后,我注意到用C++ 编译器编译C 代码并不是最好的主意。但是我没有得到如何进行这种转换并使这段代码与 C++ 兼容的答案。

当我尝试在 Qt Creator 中运行代码时,出现以下错误:

错误:从 'void*' 到 'ndpi_flow_struct*' 的无效转换 [-fpermissive] if((newflow->ndpi_flow = malloc_wrapper(size_flow_struct)) == NULL) ^

如果需要更多信息来解决问题,请发表评论。我是 C++ 新手,非常感谢您提供详细的链接答案。

编辑:这是malloc_wrapper()函数的代码

static void *malloc_wrapper(unsigned long size) 
  current_ndpi_memory += size;

  if(current_ndpi_memory > max_ndpi_memory)
    max_ndpi_memory = current_ndpi_memory;

  return malloc(size);

【问题讨论】:

【参考方案1】:

您看到此错误是因为在 c++ 中,类型应该完全匹配。

如我们所见,malloc_wrapper() 函数返回一个void *,而您的newflow->ndpi_flowndpi_flow_struct* 类型。因此,在使用c++ 编译器进行编译时,您必须添加cast,例如

if((newflow->ndpi_flow=(ndpi_flow_struct*)malloc_wrapper(size_flow_struct)) == NULL)  . . . 

强制编译器相信malloc_wrapper() 的返回值是(ndpi_flow_struct*) 类型。

或者更好的是static cast<>(请记住C++ 方面),比如

if(( newflow->ndpi_flow = 
                static_cast<ndpi_flow_struct*>malloc_wrapper(size_flow_struct)) == NULL)  . . .

相关阅读:A detailed answer on C++ Casting.

【讨论】:

我觉得(等价的)static_cast更合适,更c++ @Elemental 好吧,我不是c++ 的专家,谢谢你的建议。您能否检查一下以确保编辑看起来正常? @Sourav - 看起来很棒 @Nobody - 请记住,C++ 不允许某些 static_casts,否则它们可以与不太冗长的旧 C 样式转换正常工作。【参考方案2】:

通常我们只写

if((newflow->ndpi_flow = (ndpi_flow_struct*)malloc_wrapper(size_flow_struct)) == NULL)  

【讨论】:

感谢您的回答,效果很好,我接受了 Sourav 的回答,因为它更详细。 不鼓励使用 c 风格的演员表。公认的方法是使用 static_cast、reinterpret_cast 和 const_cast 中最宽松的,这样可以完成转换。 @RichardHodges C 风格的强制转换在C++ 中 不被鼓励。但是,问题是关于编译 C 代码(使用 C++ 编译器)。为了在 C 中保持可编译性,有必要使用 C 风格的强制转换。

以上是关于如何将 void* 转换为 foo* 以符合 C++?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串值转换为正确的类型

如何将c代码转换为布尔表达式?

使用未定义数量的参数调用C函数

如何将地址转换为函数指针以调用方法

如何快速将自己转换为 UnsafeMutablePointer<Void> 类型

如何快速将自己转换为 UnsafeMutablePointer<Void> 类型