我想知道一个成员数据类型的结构和联合之间的区别,如果有的话.
我正在寻找一些工会的例子,不是为了理解工会是如何工作的,希望我能做到,而是要看看人们对工会做了哪种黑客攻击.
所以随时分享你的工会黑客(当然有一些解释:))
如果我创建一个const联合对象(例如在下面的代码中),那么就不能完成成员赋值.那么在任何情况下都有使用const联合对象吗?
union un
{
int i;
float f;
char c;
};
const union un a;
/// ! a.i = 10; error.
Run Code Online (Sandbox Code Playgroud) 我有一个例子,我保证了类型的对齐,union max_align.我正在寻找一个更简单的例子,其中实际上使用了union来解释我的朋友.
我正在阅读K&R中关于C的联合,据我所知,联合中的单个变量可以包含几种类型中的任何一种,如果某些东西存储为一种类型并且提取为另一种,则结果纯粹是实现定义的.
现在请检查以下代码段:
#include<stdio.h>
int main(void)
{
union a
{
int i;
char ch[2];
};
union a u;
u.ch[0] = 3;
u.ch[1] = 2;
printf("%d %d %d\n", u.ch[0], u.ch[1], u.i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
3 2 515
Run Code Online (Sandbox Code Playgroud)
在这里,我在分配值u.ch
,但来自检索u.ch
和u.i
.它是实现定义的吗?或者我做的事情真的很傻?
我知道这对其他大多数人来说似乎都是初学者,但我无法弄清楚输出背后的原因.
谢谢.
我已经在定义为的头文件中构建了一个使用常量的工作C库
typedef struct Y {
union {
struct bit_field bits;
uint8_t raw[4];
} X;
} CardInfo;
static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } };
Run Code Online (Sandbox Code Playgroud)
我知道.raw
初始化程序只是C语法.
如何在其中使用联合定义常量,以便我可以在C和C++中使用它们.
假设我们有一个联盟:
typedef union someunion {
int a;
double b;
} myunion;
Run Code Online (Sandbox Code Playgroud)
在设置例如a = 123之后,是否可以检查哪种类型是联合的?我的方法是将这个联合添加到某个结构中,并在它为int时将uniontype设置为1,当它为double时将其设置为2.
typedef struct somestruct {
int uniontype
myunion numbers;
} mystruct;
Run Code Online (Sandbox Code Playgroud)
有没有更好的解决方案?
例如,假设您要在C++中实现电子表格Cell.单元格可以是字符串,数字,也可以是空的.忽略其他情况,例如它是一个公式.
在Haskell中,您可能会执行以下操作:
data Cell = CellStr String | CellDbl Double | None
Run Code Online (Sandbox Code Playgroud)
什么被认为是在C++中实现它的当前"最佳实践"?在带有类型指示符的结构中使用union,还是其他什么?
libstdc ++(GNU)和libc ++(LLVM)都std::optional
使用联合实现值存储,并且它们都包含一个虚拟成员。
GNU实现:
using _Stored_type = remove_const_t<_Tp>;
struct _Empty_byte { };
union {
_Empty_byte _M_empty;
_Stored_type _M_payload;
};
Run Code Online (Sandbox Code Playgroud)
LLVM实施:
union
{
char __null_state_;
value_type __val_;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:我们为什么需要这些_M_empty
/ __null_state_
会员?单成员工会有什么问题吗?
我遇到了关于C编程语言的这个客观问题.以下代码的输出应该是0 2
,但我不明白为什么.
请解释初始化过程.这是代码:
#include <stdio.h>
int main()
{
union a
{
int x;
char y[2];
};
union a z = {512};
printf("\n%d %d", z.y[0], z.y[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)