使用CImage时避免演员表

时间:2012-04-15 18:50:26

标签: c++ casting

最近我看到有几个人告诉别人,如果他们需要演员他们做错了什么。我在C ++中有这段代码

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

这里我转换为byte*因为GetBits()返回void*。那我怎么会

  • pixel持有一个字节*而不会投射
  • 使用void*(之前从未使用过此类型)

为了澄清,我接着使用与此类似的pixel

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

4 个答案:

答案 0 :(得分:2)

在你的情况下,转换是合理的,但在C ++中,更好的方法是使用C ++风格的转换,所以在这里你可以使用static_cast

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

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

答案 1 :(得分:2)

根据定义,在没有强制转换的情况下使用void *是不可能的,因为void *无法解除引用/递增/无论如何。它只是意味着“这里是指向某些数据的指针,我不知道是什么类型的。”

GetBits()会返回void *,因为访问数据的最佳方式取决于图片的种类(特别是颜色深度)以及您想要做的详细说明;当然,你必须把它投射到某些东西上才能对这些数据做些什么。

答案 2 :(得分:1)

你的问题很清楚。铸造并不总是意味着你做错了什么,但这是代码味道。

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

答案 3 :(得分:1)

你并不是真的在任何地方提出问题,所以在你投射到byte*以外的其他东西时,让我稍微评论一下,因为你的问题可能很危险:如果返回的指针被强制转换为指向一个2字节类型,4字节类型等,并且指向的值对于那种大小的类型没有正确对齐,而不是可能发生数据错位错误,这在某些体系结构上只会导致您的进程无效。对于byte*,演员是安全的,因为它指向最小对齐的类型,,它总是正确对齐。