C和C++上的无效转换错误

Invalid conversion error over C and C++

本文关键字:无效 转换 错误 C++      更新时间:2023-10-16

这是我的代码。

struct MemoryStruct {
  char *memory;
  size_t size;
};
 struct MemoryStruct *mem = &state->characters;
  mem->memory = realloc(mem->memory, mem->size + len + 1);

当我用"C"运行这段代码并用gcc编译它时,我没有得到任何错误。

但同样的代码,我在C++中运行,并用g++编译,我在中遇到了错误

错误:从"void*"到"char*"的转换无效[-fpermission]

为什么它在C++中给出了错误,而在C 中没有给出错误

为什么它在C++中给出了错误,而在C 中没有给出错误

因为这些语言的规则是不同的。在这种特殊情况下,不同之处在于C++不允许从void*char*的转换,而C允许。这就是编译器错误告诉你的。

C++给出了一个错误,因为没有从void*到char*的隐式转换(至少在最近的编译器中是这样)。

如果你想用C++编译这些代码,你必须转换成正确的类型:

mem->memory = static_cast<char*>(realloc(mem->memory, mem->size + len + 1));

或者,如果你想保持C兼容性:

mem->memory = (char*)realloc(mem->memory, mem->size + len + 1);

但是,如果您切换到C++,最好使用C++对象,如std::vector,它将为您执行realloc。

在C++中,您需要强制转换malloc和友元返回的值:

 mem->memory = (char*)realloc(mem->memory, mem->size + len + 1);

简单的是,C和C++都是不同的语言C启发结构,然而C++启发结构以及面向对象的范例在您的情况下C能够将void*转换为char*内置属性,但C++没有这种类型的属性,C++无法将void'转换为char',因此编译器会抛出错误。