|
|
1
18
( 编辑 )GCC和MSVC都允许“匿名”结构/联合,这可以解决您的问题。例如:
给出(在Intel上):
这需要更改您的所有声明 结构像素 到 联合像素 在您的原始代码中。但这种缺陷可以通过以下方式修复:
这也适用于VC9,带有“警告C4201:使用了非标准扩展:无名称结构/联合”。例如,微软在以下方面使用了这种技巧:
但他们通过压制不需要的警告来“欺骗”。 虽然上面的例子都可以,但是如果您经常使用这种技术,很快就会得到无法维护的代码。让事情更清楚的五点建议:
(1)更改名称
(2)返回到丑陋的强制转换拒绝的操作,但在宏或内联函数中隐藏其丑陋,如:
但这将打破严格的别名规则。(例如,参见Andreyt的回答: C99 strict aliasing rules in C++ (GCC) ) (3)保留像素的原始定义,但要做更好的投射:
(4)但那是偶数
丑陋的
. 你可以通过
有了VC9,或者GCC使用-书呆子,你就需要( 不要 用这个 海湾合作委员会 --见末尾注释 ):
(5)宏可能是首选的。在gcc中,您可以非常整齐地定义任何给定类型的联合强制转换:
对于VC9和其他编译器,没有
自我记录,更安全。而不是 太 丑陋的所有这些建议都可能编译成相同的代码,因此效率不是问题。另见我的相关答案: How to format a function pointer? .
关于GCC的警告:
GCC手册4.3.4版(但
不
版本4.3.0)声明最后一个示例
|
|
|
2
10
联合内部的结构存在问题,即允许编译器在结构(或类)成员之间添加填充字节, 位字段除外 . 鉴于:
可将其布置为:
所以结构的大小是16字节。 当放入一个联合时,编译器将占用两者中较大的容量来确定空间。另外,正如您所看到的,32位整数不会正确对齐。
我建议创建函数来组合和提取32位数量的像素。你可以申报
这比联合中的结构(包括带有位字段的结构)可靠得多:
在阅读这篇文章时,仍然有一些疑问
只是我的建议,YMMV。 |
|
|
3
10
为什么不把难看的一团糟变成一个在线程序呢?类似:
您还可以将此例程作为成员函数提供给
|