2015-03-25 58 views
3

一看到一个问题用下面的代码:什么是用例匿名联合型

union 
{ 
    float dollars; 
    int yens; 
}price; 

price是一个变量,其类型没有名称。 什么是这样一个未命名的类型有用? Lambda表达式? 这对C和C++都有效吗?

+0

这完全不重复,typedef的位置与您提供的链接相同? – 2015-03-25 08:30:10

+2

其他(某些其他数据)会告诉哪个工会成员使用。你真的应该显示更多的代码,并选择C和C++(这是不同的语言)。所以问一个新问题或强烈编辑这个问题。 – 2015-03-25 08:32:56

+0

@BasileStarynkevitch问题的核心不是“什么是工会?”但“为什么这种工会类型没有名字,为什么?” – Angew 2015-03-25 08:33:34

回答

5

的类型没有名称,这一事实对使用price变量的影响非常小。它意味着你不能(容易地)创建这种类型的另一个对象。

如果price是函数内部的局部变量,则此构造最有意义。如果你只想要一个这种类型的对象,你不需要命名该类型,所以为什么要麻烦。它没有什么不同,在全部来自:

union SomeNameIPromiseNotToUseAnywhereAndWhichDoesntConflictWithAnything 
{ 
    float dollars; 
    int yens; 
} price; 

请注意,在C++ 11及以后,你可以实际上创建另一个对象:

decltype(price) anotherPrice; 
2

在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.dollarsprice.yens因为price已经类型的可变

1

在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; 
} 
1

我在过去所用的工会处理存储格式并在它们之间进行翻译的机制。

例如,它可能是程序包含以浮点格式存储文件数量的代码,并且存储函数接受/返回浮点数。后来发现我们需要使用一个整数,所以我们只需使用联合就可以以我们所知的格式访问数据。例如:

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; 

对不起,如果有任何语法错误,这是一段时间...

0

我看到这样的代码在2D/3D计算数学图书馆的很多:

struct Matrix3x3 
{ 
    union 
    { 
     struct 
     { 
      float m00 , m01 , m02; 
      float m10 , m11 , m12; 
      float m20 , m21 , m22; 
     }; 

     float m[ 3 ][ 3 ]; 
    }; 
}; 

see also this Q


IIRC,我读的地方,使用这种方法会导致违反严格别名规则

0
struct FooBar 
{ 
    union 
    { 
     Foo foo; 
     char dummy[128]; 
    }; 
    Bar bar; 
}; 

我见过有人用无名联合来控制struct成员的偏移量。

struct成员与某个边界对齐没有简单的方法,但可以将struct的开头对齐到任意边界,然后将该成员填充到下一个边界。