我想知道在enum
({{1>} 中的)
struct
的语法
我见过各种例子,其中C
+ struct
/ union
组合用于创建复杂类型,例如:
enum
无论如何,从这个例子中,我如何根据struct MyStruct{
enum{
TYPE_1,
TYPE_2,
TYPE_3,
} type;
union{
int value_1;
int value_2;
int value_3;
} value;
};
// ...
struct MyStruct test_struct;
字段存储/测试当前的“类型”?
如果我有指向enum
的指针,这似乎不起作用;踢回未知成员错误:
test_struct
我只是好奇,我是否需要将struct MyStruct *test_pointer = &test_struct;
test_pointer->value = test_pointer->VALUE_1;
值作为全局值来访问?
enum
非常感谢任何澄清。
答案 0 :(得分:6)
这种结构的预期用法是这样的:
switch (test_struct.type) {
case TYPE_1:
printf("%d", test_struct.value.value_1);
break;
case TYPE_2:
printf("%d", test_struct.value.value_2);
break;
case TYPE_3:
printf("%d", test_struct.value.value_3);
break;
}
请注意,大写VALUE_1
,VALUE_2
和VALUE_3
是不正确的,因为它们不是常量,而是联盟的成员。
TYPE_1
位于结构中, TYPE_2
,TYPE_3
和enum
都可以全局访问。
答案 1 :(得分:1)
联合会发生的事情是其中定义的所有对象占用相同的内存。读取与最后写入的对象不同的对象是非法的。
在
union blah {
int bleh;
double blih;
char bloh[42];
};
union blah myobject;
myobject
包含int
,double
或char[]
中的一个。而且没有迹象表明哪一个是正确的。该指示必须由程序员保存在其他地方:
int lastblahwrite; /* 0: int; 1: double; 2: char[] */
strcpy(myobject.bloh, "The quick brown dog");
lastblahwrite = 2;
以后可以用作
switch (lastblahwrite) {
case 0: printf("%d\n", myobject.bleh); break;
case 1: printf("%f\n", myobject.blih); break;
case 2: printf("%s\n", myobject.bloh); break;
default: assert(!"this didn't happen"); break;
}
为了使管理更容易,不如使用两个单独的变量,通常将union本身和指示符变量分组到结构中,如示例所示。
管理层仍然必须由程序员编写。没有什么是自动的。