匿名联合类型的用例是什么?

时间:2015-03-25 08:25:37

标签: c++ c

A看到了一个问题,其中包含以下代码:

union
{
     float dollars;
     int yens;
}price;

price是一个类型没有名称的变量。 什么是这种无名类型有用? Lambda表达式? 这在C和C ++中都有效吗?

6 个答案:

答案 0 :(得分:5)

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

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

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

请注意,在C ++ 11及更高版本中,可以实际创建另一个对象:

decltype(price) anotherPrice;

答案 1 :(得分: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";

答案 2 :(得分:1)

根据此链接在C中

https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html#Unnamed-Fields

您可以像price.dollarsprice.yens一样访问联合的成员,因为price已经是union类型的变量,并且不需要创建相同的新对象类型。

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

答案 3 :(得分:1)

我过去曾使用过工会作为处理存储格式和在它们之间进行转换的机制。

例如,程序可能包含用于以浮动格式存储文件中的金额以及存储函数接受/返回浮点数的代码。后来发现我们需要使用一个整数,所以我们只需使用union就可以以我们所知的格式访问数据。例如:

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;

对不起,如果有任何语法错误,它已经有一段时间......

答案 4 :(得分: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,我在某处读到使用此类方法导致违反严格别名规则

答案 5 :(得分:0)

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

我看到人们使用无名工会来控制struct成员的偏移。

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