除其他事项外,C11还增加了"匿名结构和联盟".
我四处寻找,但无法找到匿名结构和工会何时有用的明确解释.我问,因为我不完全明白它们是什么.我得知它们之后是没有名字的结构或联合,但我总是(必须?)将其视为一个错误,所以我只能设想一个用于命名结构的用法.
换句话说,根据C 标准,这段代码安全吗?(假设uint8_t是一个字节)
void detectEndianness(void){
union {
uint16_t w;
uint8_t b;
} a;
a.w = 0x00FFU;
if (a.b == 0xFFU) {
puts("Little endian.");
}
else if (a.b == 0U) {
puts("Big endian.");
}
else {
puts("Stack Overflow endian.");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我把它改成这个怎么办?请注意if我所知道的第三种情况.
a.w = 1U;
if (a.b == 1U) { puts("Little endian."); }
else if (a.b == 0U) { puts ("Big endian."); }
else if (a.b == 0x80U) { /* Special potential */ }
else { puts("Stack …Run Code Online (Sandbox Code Playgroud) 我有两个结构,其值应该计算一个沉重的平均值,就像这个简化版本:
typedef struct
{
int v_move, v_read, v_suck, v_flush, v_nop, v_call;
} values;
typedef struct
{
int qtt_move, qtt_read, qtt_suck, qtd_flush, qtd_nop, qtt_call;
} quantities;
Run Code Online (Sandbox Code Playgroud)
然后我用它们来计算:
average = v_move*qtt_move + v_read*qtt_read + v_suck*qtt_suck + v_flush*qtd_flush + v_nop*qtd_nop + v_call*qtt_call;
Run Code Online (Sandbox Code Playgroud)
现在和他们一起我需要包含另一个变量.现在,例如,我需要包括v_clean和qtt_clean.我无法将结构更改为数组:
typedef struct
{
int v[6];
} values;
typedef struct
{
int qtt[6];
} quantities;
Run Code Online (Sandbox Code Playgroud)
这将简化我的工作,但它们是需要变量名称清晰的API的一部分.
所以,我正在寻找一种方法来访问那些结构的成员,也许正在使用sizeof(),所以我可以将它们视为一个数组,但仍然保持API不可更改.保证所有值都是int,但我不能保证一个的大小int.
在我脑海中写下这个问题......能union做到这一点吗?还有另一种聪明的方法可以自动化添加其他成员的任务吗?
谢谢,Beco