我遇到了这段代码,但找不到该条目的含义union
以及如何使用它
班级名称:
class Other_Device{
public:
unsigned char Variable;
union SomeBufer {
unsigned char out[2];
struct {
unsigned char StructVariable;
} in; //end of struct
}; //end of union
SomeBufer A_Buffer ;
SomeBufer T_Buffer ;
void classfunc(void);
}; //end of class
在 cpp 文件本身中,大约有以下对该类的调用:
void Other_device::classfunc(void){
CppVariable = A_Buffer.in.StructVariable;
}
Variable = 0;
extern Other_device other_device;
other_device.A_Buffer.out[0] = 1;
other_device.T_Buffer.out[0] = 1;
我对函数本身不感兴趣;我想了解我是否正确理解了类语法。
相同的代码,但有注释,据我所知
class Other_Device{
public:
unsigned char Variable;
union SomeBufer {
unsigned char out[2] //создание массива не имеющего отношения к структуре, но относящегося к объединению
struct { //создание структуры внутри объединения
unsigned char StructVariable;
} in; //end of struct //in нужен для дальнейшего обращения к переменным структуры, а не к массиву out.
}; //end of union
SomeBufer A_Buffer ; //Вот это не очень понимаю, создание двух массивов содержащих в себе массив out из объединения SomeBufer
SomeBufer T_Buffer ;
void classfunc(void);
}; //end of class
.cpp文件
void Other_device::classfunc(void){
CppVariable = A_Buffer.in.StructVariable;
}
Variable = 0;
extern Other_device other_device; //то, что необходимо для того, чтобы я мог обращаться к переменным класса Other_device, при этом добавляя в начале other_device. ?
other_device.A_Buffer.out[0] = 1;
other_device.T_Buffer.out[0] = 1;
// и можно ли обращаться к массиву объединения как other_device.SomeBuf.out напрямую, если мне не нужны два массива A_Buffer и T_Buffer с одинаковой структурой и если можно, то как это сделать без ошибки "type name is not allowed"
您能否具体告诉我我的评论:我是否正确理解了编写的代码,如果不正确,出了什么问题?
发生了什么
让我们用人类的语言重写至少部分代码:
该结构不再是匿名的,现在可以正常读取。我们可以清楚地看到联合体中只有两个变量:
out
和in
。由于联合中的所有数据都存储在共享内存中,因此它的工作原理如下:访问 in.StructVariable 时,您访问 out[0],当访问 out[0] 时,您访问 in.StructVariable。也就是说,将数据写入 in.StructVariable 后,您可以使用 out[0] 读取它,反之亦然。一般来说,如果我们从 C++ 语言标准的角度来看待它,那么尝试读取之前未编写过的联合字段会被视为未定义行为(换句话说,不仅不能保证它会工作,但也不能保证它到底如何工作/不工作)。但是,许多编译器支持从非活动字段读取。因此,该代码很可能按上述方式工作。见协会公告。另外,还有C语言,这也是合法的。