如何将 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_flow
是ndpi_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_cast
s,否则它们可以与不太冗长的旧 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++?的主要内容,如果未能解决你的问题,请参考以下文章