我知道它的旧问题,但是什么是保持现在转换为c ++的c app(遗留)的旧逻辑的简单解决方案?
在c中工作:
void *p;
void *response = malloc(60 * 81);
p = response ;
p+=4;
g ++中的给出:ISO C ++禁止递增'void *'类型的指针
更新:
如果我将其更改为char *即时收到此错误:
char *p;
char *response = malloc(60 * 81);
error: invalid conversion from ‘void*’ to ‘char*’
还有char *可以容纳其他类型(基本类型),如short,int,bool? 这就是为什么在这个遗留代码中使用它来保存diffident类型
答案 0 :(得分:5)
最简单的方法是将void *
转换为char *
。由于ISO C也禁止void*
算术运算,因此gcc将其视为char*
作为扩展名。有关详细信息,请参阅此处:http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Pointer-Arith.html#Pointer-Arith
答案 1 :(得分:3)
它只在gcc中工作。关于void *的指针关节镜是未定义的。在这种情况下,Gcc将其视为char *。因此,修复遗留代码的最佳方法是仔细更改所有指向char *的指针。
答案 2 :(得分:2)
最简单的方法是寻找编译器选项来改变这种行为。
最好的方法是将类型更改为char *
,因为这似乎符合用法和意图。
答案 3 :(得分:1)
从gnu C移植到C ++并非易事。 void*
上的算术不是C,它是一个扩展名。
将这些东西移植到C ++应该更加小心,特别是如果C代码从一开始就不太合适。该数据具有“预期”类型,因此您应该在C ++中使用该类型,而不是像char
那样的另一个猜测。显然这不被认为是C字符串,对C字符串执行+= 4
没有多大意义。因此,假设基类型的大小为4
,可能来自代码的其余部分,您可以猜测它是如何解释的。
获得正确的类型后,使用new[]
分配数组。如果可以避免,请不要在C ++中使用malloc
。
答案 4 :(得分:-2)
因为“pointeur算术”......
如果您写p += 4
,则表示:p += ((sizeof(void *) * 4)