ISO C ++禁止在转换为c ++的遗留代码中递增“void *”类型的指针

时间:2012-07-20 13:25:34

标签: c g++ void-pointers

我知道它的旧问题,但是什么是保持现在转换为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类型

5 个答案:

答案 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)