我读了这个链接what-is-the-point-behind-unions-in-c 但是这个答案对我来说还不够。
我可以对工会的使用有更多的解释吗?我不想要任何与内存相关的示例,例如,这将占用最多 4 个字节(浮点数占用 4 个字节)。
union un{
char ch;
int iNum;
float fNum;
};
所以我的问题是,
union 到底有什么用?
为什么我们需要这个?
请帮助我,这让我很困惑。谢谢。
我读了这个链接what-is-the-point-behind-unions-in-c 但是这个答案对我来说还不够。
我可以对工会的使用有更多的解释吗?我不想要任何与内存相关的示例,例如,这将占用最多 4 个字节(浮点数占用 4 个字节)。
union un{
char ch;
int iNum;
float fNum;
};
所以我的问题是,
union 到底有什么用?
为什么我们需要这个?
请帮助我,这让我很困惑。谢谢。
联合的两个最常见的用途可能是:
要实现您自己的Variant 类型,aunion
使您能够在不浪费内存的情况下表示所有不同的类型。这个答案给出了一个很好的例子。
键入双关语,但我也会阅读Understanding Strict Aliasing,因为在很多情况下type punning
未定义行为。尽管实际上大多数编译器都支持通过联合进行类型双关。
如果您有一个可以是a或a或...char
的变量,那就太好了int
它通常用于包含联合实际类型的结构内部。解析器经常使用它从词法分析器返回一个标记。就像是:
struct token
{
int token_type;
union
{
char *s; /* For string or keyword tokens */
double f; /* For floating point tokens */
long i; /* For integer tokens */
} token_value;
};
在上述结构中,成员中使用的token_value
成员依赖于token_type
成员。
还可以通过滥用联合中的数据来使用联合,在其中设置变量的一个成员并读取另一个成员。例如,这可以用于将浮点数转换为一系列字节。
喜欢
union data
{
char data[sizeof(double)];
double value;
};
通过设置value
成员,您可以读取double
值的单独字节,而无需类型转换或指针运算。这是技术上实现定义的行为,这意味着编译器可能不允许这样做。虽然它非常常用,所以所有当前的编译器都允许它。