我已经用 C 完成了相当数量的编程,所以我喜欢认为我相当了解它。但是,我还是经常学习一个新的 C 技巧,并在这个过程中了解到我并不像我想象的那样了解 Cquite。今天的技巧是使用 C 联合将结构字段组合在一起,这是我通过这个 LWNarticle(via) 了解到的。假设您有一个包含一堆字段的结构,并且您想在同一个名称下同时处理其中的一些;也许您想通过结构赋值方便地将它们复制为块。但是,您还希望保持简单的字段访问,并且使用您的结构的人不必知道这些字段特别特别(除其他外,这可能会防止分组泄漏到您的 API 中)。传统的老派 C 方法是一个带有 #defines ontop 的子结构: struct a { int field1;结构子{ int field_2; int field_3; };};#define field2 sub.field_2#define field2 sub.field_3 问题之一是#defines,它作为一种重命名字段的方式已经非常失宠。事实证明,现代 C 通过为命名空间目的滥用联合让您做得比这更好。你所做的是在一个匿名联合中嵌入两个相同的子结构,每个子结构都有相同的字段,给一个子结构一个名字,让另一个保持匿名。匿名联合中的匿名子结构允许您访问其字段,而无需任何其他级别的名称。非匿名结构使您可以按名称引用整个事物。 struct a { int field1;联合{ 结构{ int field2; int field3; };结构{ int field2; int field3; } 子; };};人们自然会创建#define 宏来自动创建此结构,以便所有字段在联合内部的两个结构之间保持同步。否则这个“聪明”的设置是相当脆弱的。
(我认为这在现代 C 社区中可能是众所周知的事情,但由于各种原因,我与现代 C 脱节,尤其是反常的现代 C。这绝对是反常的。)