问题标签 [unions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1806 浏览

c# - 无法封送包含联合的结构

我有一个看起来像这样的 C++ 结构:

我试图在 C# 中像这样编组它:

但是,当我尝试将数据加载到我的结构中时,只有偏移数组的前 3 个元素存在(数组的长度为 3)。我可以确认它们的值是正确的——但我仍然需要其他 3 个元素。我在做一些明显错误的事情吗?

我正在使用这些函数来加载结构:

加载示例:

如果您需要更多信息,请与我们联系。

0 投票
7 回答
458 浏览

c - 使用字符数组作为长整数数组

在我的 AVR 上,我有一个字符数组,它们以 {R,G,B,x,R,G,B,x,...} 的形式保存颜色强度信息(x 是未使用的字节)。有什么简单的方法可以写一个 long int(32 位),char myArray[4*LIGHTS]这样我就可以轻松地写一个 0x00BBGGRR 数字?

我的类型转换很粗糙,我不知道该怎么写。我猜只是创建一个指向 long int 类型的指针并将其设置为等于 myArray,但是我不知道如何任意告诉它将组 x 设置为 myColor。

编辑:我不确定类型转换是否是正确的术语,因为我认为如果它只是将 32 位数字截断为 8 位?

0 投票
3 回答
16672 浏览

c - 可以在声明中初始化联合吗?

例如,假设我们有一个工会

当声明这个联合类型的变量时,有没有办法设置一个初始值?

0 投票
7 回答
252829 浏览

c - “在非结构或联合的情况下请求成员'*******'”是什么意思?

这个错误的含义有一个简单的解释吗?

我在学习C的时候遇到过几次,但我不知道它是什么意思。

0 投票
5 回答
176 浏览

c++ - 分配给会员工会

假设我有一个班级,里面有工会成员:

如果我有指向不同 ClassX 对象的指针 x1 和 x2,请执行以下操作:

与此具有相同的效果:

? 谢谢。

0 投票
6 回答
66534 浏览

c++ - 为什么 C++ 不允许匿名结构?

一些 C++ 编译器允许匿名联合和结构作为标准 C++ 的扩展。这是一些语法糖,偶尔会很有帮助。

阻止它成为标准一部分的理由是什么?有技术障碍吗?一个哲学的?或者只是不足以证明它的合理性?

这是我正在谈论的示例:

我的编译器会接受这一点,但它警告说“无名结构/联合”是 C++ 的非标准扩展

0 投票
1 回答
991 浏览

c - 如何在 C 中初始化匿名结构的第二个成员?

我已经为可能在 LISP 中使用的整数和指针等创建了一个结构。

指针至少对齐 8 字节,因此 tag=0。一个整数是 29 位,标签为 1。其他类型有不同的标签值。

我想以不同的方式初始化它们。

对于指针:

或者

这是有效的,因为我假设 GCC 假设我要初始化联合的第一个成员。

我还想初始化一个整数 - 像这样:

我知道这不是标准的 C,但是在 GCC 中使用匿名结构是否有可能?

0 投票
16 回答
133806 浏览

c++ - C 和 C++ 中联合的用途

我之前很舒服地使用了工会;今天当我看到这篇文章并知道这段代码时我很震惊

实际上是未定义的行为,即从最近写入的联合成员之外的成员读取会导致未定义的行为。如果这不是联合的预期用途,那是什么?有人可以详细解释一下吗?

更新:

我想在事后澄清一些事情。

  • 对于 C 和 C++,这个问题的答案是不一样的。我无知的年轻自我将其标记为 C 和 C++。
  • 在浏览了 C++11 的标准之后,我不能确定地说它调用访问/检查非活动联合成员是未定义/未指定/实现定义的。我只能找到§9.5/1:

    如果标准布局联合包含多个共享公共初始序列的标准布局结构,并且此标准布局联合类型的对象包含标准布局结构之一,则允许检查任何标准布局的公共初始序列标准布局结构成员。§9.2/19:两个标准布局结构共享一个共同的初始序列,如果相应的成员具有布局兼容的类型,并且两个成员都不是位域或两者都是一个或多个初始序列的具有相同宽度的位域成员。

  • 在 C 语言中(C99 TC3 - DR 283起)这样做是合法的(感谢 Pascal Cuoq提出这个问题)。但是,如果读取的值恰好对于它所读取的类型无效(所谓的“陷阱表示”),那么尝试这样做仍然会导致未定义的行为。否则,读取的值是实现定义的。
  • C89/90 在未指定的行为(附件 J)下指出了这一点,K&R 的书说它是定义的实现。来自 K&R 的报价:

    这就是联合的​​目的——一个可以合法地持有几种类型中的任何一种的单一变量。[...] 只要用法一致:检索到的类型必须是最近存储的类型。程序员有责任跟踪当前存储在联合中的类型;如果将某些内容存储为一种类型并提取为另一种类型,则结果取决于实现。

  • 摘自 Stroustrup 的 TC++PL(重点是我的)

    联合的使用对于数据的兼容性可能是必不可少的 [...]有时误用于“类型转换”。

最重要的是,提出这个问题(自我问起,其标题保持不变)的目的是了解联合的目的,而不是标准允许的内容。例如,C++ 标准当然允许使用继承进行代码重用,但是这不是将继承作为 C++ 语言特性引入的目的或初衷。这就是安德烈的答案继续被接受的原因。

0 投票
5 回答
429 浏览

c++ - 了解联合的内存内容

假设我定义一个这样的联合:

有人能告诉我存储在哪里的内存tst会是什么样子吗?

我试图了解1102813594该程序产生的输出。

0 投票
4 回答
662 浏览

mysql - 在 MySQL 中将 ac/c++ 样式联合作为列实现

朋友们,

我有一个奇怪的需求,无法思考解决问题的方法。由于关键字回收(如您所见),伟大而强大的 Google 几乎没有帮助。你能帮我吗?

我想要做的是将多种类型的数据存储在 MySQL 的单个列中。

这是一个相当于 C 联合的数据库(如果你搜索 MySQL 和联合,你显然会在 SQL 中的 UNION 关键字上得到一大堆东西)。

[以下是人为和简化的案例]所以,让我们说我们有一些人 - 有名字 - 和 STORMTROOPERS - 有 TK 号码。您不能同时拥有姓名和 TK 号码。你要么是 BOB SMITH,要么是 TK409。

在 CI 中可以将其表示为一个联合,如下所示:

这使得我要么存储指向字符数组的指针,要么存储类型为 EmperialPersonnelRecord 的 ID,但不能同时存储两者。

我正在寻找列上的 MySQL 等效项。我的专栏将存储 int、double 或 varchar(255)(或任何组合)。但只会占用最大元素的空间。

这可能吗?

(当然,只要有足够的时间、金钱和意愿,一切皆有可能——我的意思是,如果我很穷、很懒并且在最后期限内……也就是“开箱即用”,这是否可能)