【问题标题】:What is the use of a constant union object?常量联合对象有什么用?
【发布时间】:2012-08-10 08:08:26
【问题描述】:

如果我创建了一个 const union 对象(例如在下面的代码中),则不能在其中进行任何成员分配。那么在任何情况下,制作一个 const union 对象有什么用处?

union un
{
    int i;
    float f;
    char c;
};
const union un a; 
/// ! a.i = 10; error.

【问题讨论】:

  • c 中,通过与最近设置的成员不同的成员来解释联合的情况并不少见。当然,它可能是 const volatile - 即我们不会更改它,但其他人可能会,我们需要能够看到它。
  • 如果整个该死的联合是const,则不会。
  • @Xeo,当我使用 gcc 进行测试时,如果没有“union”部分,它将无法编译。
  • @AmigableClarkKant:是的,我以为这个问题一开始只是标记为 C++,但它也是 C,所以union“详细类型说明符”使它可移植。我回滚了我的回滚。 :P

标签: c++ c constants unions


【解决方案1】:

您仍然可以按如下方式初始化联合:

const union un a = { .i = 100 }; 

然后在你的代码中使用它。

【讨论】:

  • 在 C 中,即。在 C++ 中,我认为您可以编写构造函数之类的东西。
  • 哈哈,你比我快了 35 秒。 :-)
  • 这是我不知道的。这样任何联合成员都可以被初始化!
【解决方案2】:

您仍然可以在声明时分配它,例如:

const union un a = {0};

更新:该符号设置了工会成员的第一个

【讨论】:

  • @R.MartinhoFernandes,所有成员,归零。
  • @R.MartinhoFernandes 第一个成员。形式上,如果你有union un { short s; double d; }; union un a = {};d 的内容是未定义的(如果a 是 const,那么无论如何你都无法合法地访问它们。
  • @AmigableClarkKant 这是错误的(除非他们在 C 标准的最新版本中进行了更改)。在 C90 中,联合初始化始终是第一个成员。在 C99 中,有一种扩展语法(C++ 中不存在)来初始化不同的成员,但仍然只有一个成员被初始化。
  • @JamesKanze 所以据我所知,un a = {0}; 的意思是:将第一个联合成员设置为零,并将其余联合成员设置为静态,即设置它们也为零/NULL。
  • @JamesKanze 我认为在实践中,它会像“将所有内容设置为零,然后将第一个成员设置为 42”。
猜你喜欢
  • 2015-05-24
  • 2019-04-21
  • 1970-01-01
  • 2017-01-31
  • 2011-06-28
  • 1970-01-01
  • 2021-11-19
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多