1

我知道它的老问题,但是保持现在转换为 c++ 的 c 应用程序(旧版)的旧逻辑的简单解决方案是什么?

在 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 吗?这就是为什么在这个遗留代码中使用它来保存不同的类型,

4

5 回答 5

5

最简单的方法是将 to 强制void *转换为char *。由于 ISO C 也禁止void*算术,gcc 将其视为 achar*作为扩展。有关更多详细信息,请参见:http: //gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Pointer-Arith.html#Pointer-Arith

于 2012-07-20T13:28:21.097 回答
3

它只在 gcc 中工作。void * 上的指针算法未定义。在这种情况下,Gcc 将其视为 char *。因此,修复遗留代码的最佳方法是仔细更改所有指向 char * 的指针。

于 2012-07-20T13:29:48.707 回答
2

最简单的方法可能是寻找编译器选项来改变这种行为。

最好的可能是将类型更改为char *,因为这似乎符合用法和意图。

于 2012-07-20T13:28:36.927 回答
1

从 gnu C 移植到 C++ 并非易事。算术void*不是 C,它是一个扩展。

将这些东西移植到 C++ 应该更加小心,特别是如果 C 代码从一开始就不太合适。该数据具有“预期”类型,因此您应该在 C++ 中使用该类型,而不是像char. 显然这不被认为是 C 字符串,+= 4为 C 字符串做没有多大意义。因此假设基本类型的大小为4,可能从其余代码中您可以猜到必须如何解释它。

一旦你有正确的类型,使用new[]来分配数组。malloc如果可以避免,请不要在 C++ 中使用。

于 2012-07-20T14:43:30.877 回答
-2

因为“指针算术”......如果你写 p += 4它意味着:p += ((sizeof(void *) * 4)

于 2012-07-20T13:27:20.347 回答