我有这个 C++ 代码:
#include <stdlib.h>
int main(){
char *Teclas;
Teclas = calloc(1024,sizeof(char));
}
并且编译器给出以下错误:
error: invalid conversion from `void*' to `char*'
这个错误是什么意思,我该如何解决?
我有这个 C++ 代码:
#include <stdlib.h>
int main(){
char *Teclas;
Teclas = calloc(1024,sizeof(char));
}
并且编译器给出以下错误:
error: invalid conversion from `void*' to `char*'
这个错误是什么意思,我该如何解决?
问题是您正在尝试使用 C++ 编译器编译 C。正如错误消息所说,这一行:
Teclas = calloc(1024,sizeof(char));
尝试将void*
返回的无类型指针转换calloc
为类型char*
指针以分配给该类型的变量。这种转换在 C 中有效,但在 C++ 中无效。
解决方案是使用 C 编译器。看起来您正在使用 GCC,因此只需将源文件重命名为something.c
,并使用gcc
而不是g++
.
如果你真的必须为错误的语言使用编译器,并且不想用惯用的 C++ 重写它,那么你需要强制转换通过编译器:
Teclas = static_cast<char*>(calloc(1024,sizeof(char)));
或者,如果您希望代码保持有效 C:
Teclas = (char*)calloc(1024,sizeof(char));
但不要那样做:为语言使用正确的编译器。除非这是将程序转换为 C++ 的第一阶段;在这种情况下,接下来要做的是摆脱这些分配并std::string
改为使用。
calloc()
返回一个 void*。您需要将其值转换为 Teclas 的任何类型,这似乎是char*
. 所以Teclas = (char*)calloc(...)
。
void int main(int argc,char *argv[])
嗯……也许只是int main(int argc, char *argv[])
……
除此之外:这看起来像 C 代码。这些行中没有任何内容表明您使用 C++。您看到的错误是您将 C 代码视为 C++ 的结果,而事实并非如此,因为 C 不是 C++,C++ 不是 C,也不是另一个的子集。
使用 C 编译器编译 C 代码。
最好的解决方案是使用 C 编译器编译您的代码,因为这是 C 代码。你真的不应该像编译 C++ 一样编译 C 代码。但是,要直接回答您的问题,您可以强制 C++ 编译器编译您的 C 代码(这非常糟糕!!!!)。
在 C++ 中,无论何时使用该alloc
族的任何函数,都必须将返回值转换为左值的类型。所以,在这种情况下:
Teclas = (char*)calloc(1024, sizeof(char));
我执行上述操作的方式是这样的:
Teclas = (char*)malloc(1024 * sizeof(*Teclas));
这里的好处:如果您更改 的类型Teclas
,您仍然会得到正确的分配大小。另外,我更喜欢malloc
一般使用。
此外,您在整个代码中都存在重大问题。一方面,void int main(...)
???而且你在打印它之前从来没有初始化它的内容Teclas
,但是你释放它并出于某种原因再次调用它。我认为你的意思是让它成为一个 do while 循环,但没有do
.
另外,void KeyLogger();
是错误的。这就是你声明函数的方式,但由于它是一个声明,它应该在 main 之外。
在 android NDK JNI 上,即使使用类型转换、旧样式或新样式,错误仍然没有消失。
buffer = (char *) malloc(10);
xxxx=static_cast<char*>(calloc(1024,sizeof(char)));
为了使错误消失,需要将额外的包含添加到路径和符号中。
项目 -> 属性 -> C/C++ 常规 -> 路径和符号
在 Includes 选项卡/GNU C++ 上,添加以下路径(使用适当的 gcc 版本 4.6、4.8...)当然在 windows 上,该路径将是 windows 路径...。
{NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.6/include
如果您可以确保代码中没有其他错误,则可以添加 g++ 标志:-fpermissive
将错误置于警告中。
经验:g++ -fpermissive yourcode.cpp