0

最近我看到一些人告诉其他人,如果他们需要施法,他们就做错了。我在 C++ 中有这段代码

byte* pixel = (byte*)image->GetBits();

在这里我转换为 abyte*因为 GetBits() 返回 a void*。那我怎么办

  • pixel一个字节*没有强制转换
  • 使用void*(我以前从未使用过这种类型)

为了澄清,然后我继续使用pixel与此类似的方法。

*(pixel) += 20;
*(pixel + 1) += 20;
*(pixel + 2) += 20;
4

4 回答 4

2

在您的情况下,强制转换是合理的,但在 C++ 中,更好的强制转换方法是使用 C++ 风格的强制转换之一,因此您可以在此处使用static_cast

byte* pixels = static_cast<byte*>(image->GetBits());

要了解各种 C++ 风格的演员表,以及在哪里使用,请阅读以下主题:

于 2012-04-15T18:53:36.487 回答
2

根据void *定义,不使用强制转换是不可能的,因为 avoid *不能被取消引用/递增/无论如何。它只是意味着“这里有一个指向一些数据的指针,我不知道是什么样的”。

GetBits()返回 avoid *因为访问数据的最佳方式取决于图像的类型(特别是颜色深度)和您想要做的详细说明;自然,您必须将其转换为某些东西才能对此类数据执行某些操作。

于 2012-04-15T18:56:04.557 回答
1

你的问题很清楚。强制转换并不总是意味着你做错了什么,但它是一种代码味道。

在您的特定情况下,代码气味正在返回一个void *. 为什么需要一个返回的函数void *

于 2012-04-15T18:53:45.633 回答
1

您实际上并没有在任何地方提出问题,所以让我评论一下何时转换为 a 以外的其他东西byte*,因为您的情况可能很危险:如果返回的指针被转换为指向 2 字节类型的指针,则 4-字节类型等,并且指向的值未针对该大小的类型正确对齐,则可能会发生数据未对齐错误,这在某些架构上只会完全杀死您的进程。因为byte*强制转换是安全的,因为它指向最小对齐的类型,,它总是正确对齐。

于 2012-04-15T20:15:02.377 回答