所以我试图将来自libcURL HTTP请求的响应存储到稍后要解析的C字符串中。响应代码完全用C语言编写,而其他所有内容都是用C ++编写的,而且对于任何其他C ++编译器,它应该可以正常工作。但是当我尝试编译时,即使我给出了' -x c'参数后跟文件名,我得到了这些具体的答案。
g++ main.cpp -x c cJSON.c -x c respbuffer.c -lcurl -lm
./respbuffer.c:14:9: error: assigning to 'char *' from incompatible type 'void *'
s->ptr = malloc(s->len+1);
^ ~~~~~~~~~~~~~~~~
./respbuffer.c:23:9: error: assigning to 'char *' from incompatible type 'void *'
s->ptr = realloc(s->ptr, new_len+1);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
奇怪的是,只有在使用g ++进行编译时才会弹出此错误。如果我使用gcc,它运行正常,并且运行得足够顺畅。对于好奇,我在Xcode中编写了所有内容,并且我正在使用GCC 4.2.1进行编译。
答案 0 :(得分:9)
这是因为C对类型非常宽松,而C ++是严格的。 malloc()返回void *,因此为了将其用作char *,您需要将其强制转换。
答案 1 :(得分:2)
在C中,malloc
函数返回堆上的内存块void*
。在C中它的一切正常,因为void*
被隐式地转换为char*
。
但是在C ++中它是被禁止的,所以你必须明确地施展它。
所以在这种情况下,正确的代码是:
s->ptr = static_cast<char*>(malloc(s->len+1));
答案 2 :(得分:0)
您不应该使用C ++编译器来编译C代码。这两种语言是不同的,C中正确的代码可能在C ++中默默地行为不端。
在代码中添加强制转换会掩盖问题;即使它现在似乎有用,你真的不知道还会发生什么。
在我的系统上,-x c
导致g++
实际调用C编译器。也许您有一些不支持该开关的g ++版本,或者g++
可能是您系统上某些其他编译器的别名。
如果无法让-x c
工作,请使用gcc
作为编译器而不是g++
。 (您需要对C文件使用单独的调用,而不是对C ++文件,然后是链接步骤。)