最近我看到有几个人告诉别人,如果他们需要演员他们做错了什么。我在C ++中有这段代码
byte* pixel = (byte*)image->GetBits();
这里我转换为byte*
因为GetBits()返回void*
。那我怎么会
pixel
持有一个字节*而不会投射void*
(之前从未使用过此类型)为了澄清,我接着使用与此类似的pixel
。
*(pixel) += 20;
*(pixel + 1) += 20;
*(pixel + 2) += 20;
答案 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*
,演员是安全的,因为它指向最小对齐的类型,即,它总是正确对齐。