一看到一个问题用下面的代码:什么是用例匿名联合型
union
{
float dollars;
int yens;
}price;
price
是一个变量,其类型没有名称。 什么是这样一个未命名的类型有用? Lambda表达式? 这对C和C++都有效吗?
一看到一个问题用下面的代码:什么是用例匿名联合型
union
{
float dollars;
int yens;
}price;
price
是一个变量,其类型没有名称。 什么是这样一个未命名的类型有用? Lambda表达式? 这对C和C++都有效吗?
的类型没有名称,这一事实对使用price
变量的影响非常小。它意味着你不能(容易地)创建这种类型的另一个对象。
如果price
是函数内部的局部变量,则此构造最有意义。如果你只想要一个这种类型的对象,你不需要命名该类型,所以为什么要麻烦。它没有什么不同,在全部来自:
union SomeNameIPromiseNotToUseAnywhereAndWhichDoesntConflictWithAnything
{
float dollars;
int yens;
} price;
请注意,在C++ 11及以后,你可以实际上创建另一个对象:
decltype(price) anotherPrice;
在C++中,它是有效的。代码定义了一个名为price的局部变量,它可以存储整数值yens
或浮点值dollars
。不知道它是如何使用的,我只能断定变量是一个本地/临时变量(并且可能在一个试图做得太多的函数中)。
实施例:
union
{
float dollars;
int yens;
} price;
if(currency != "USD")
price.yens = ConvertToYEN(fullPrice);
else
price.dollars = GetUpdatedPriceInUSD(abc, currency);
if(currency == "YEN")
std::cout << "Using price in yens: " << price.yens << "\n";
根据该链接
https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html#Unnamed-Fields
可以只访问该联盟的成员等price.dollars
和price.yens
因为price
已经类型的可变
在C并且不需要创建同一类型的新对象。
union
{
float dollars;
int yens;
}price;
int main(void) {
price.dollars = 90.5;
printf("%f\n",price.dollars);
price.yens = 20;
printf("%d\n",price.yens);
return 0;
}
我在过去所用的工会处理存储格式并在它们之间进行翻译的机制。
例如,它可能是程序包含以浮点格式存储文件数量的代码,并且存储函数接受/返回浮点数。后来发现我们需要使用一个整数,所以我们只需使用联合就可以以我们所知的格式访问数据。例如:
price.dollars = load_from_file();
if (yen_flag)
// use price.yen
else
// use price.dollars
它也常用于实现独立存储整数。
union {
int int_val;
char as_bytes[4];
} int_store;
对不起,如果有任何语法错误,这是一段时间...
我看到这样的代码在2D/3D计算数学图书馆的很多:
struct Matrix3x3
{
union
{
struct
{
float m00 , m01 , m02;
float m10 , m11 , m12;
float m20 , m21 , m22;
};
float m[ 3 ][ 3 ];
};
};
IIRC,我读的地方,使用这种方法会导致违反严格别名规则
struct FooBar
{
union
{
Foo foo;
char dummy[128];
};
Bar bar;
};
我见过有人用无名联合来控制struct
成员的偏移量。
将struct
成员与某个边界对齐没有简单的方法,但可以将struct
的开头对齐到任意边界,然后将该成员填充到下一个边界。
这完全不重复,typedef的位置与您提供的链接相同? – 2015-03-25 08:30:10
其他(某些其他数据)会告诉哪个工会成员使用。你真的应该显示更多的代码,并选择C和C++(这是不同的语言)。所以问一个新问题或强烈编辑这个问题。 – 2015-03-25 08:32:56
@BasileStarynkevitch问题的核心不是“什么是工会?”但“为什么这种工会类型没有名字,为什么?” – Angew 2015-03-25 08:33:34