enum in a struct;新手在c

时间:2011-05-05 18:54:36

标签: c pointers enums struct adt

我想知道在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

非常感谢任何澄清。

2 个答案:

答案 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_1VALUE_2VALUE_3是不正确的,因为它们不是常量,而是联盟的成员。

无论相应的TYPE_1位于结构中,

TYPE_2TYPE_3enum都可以全局访问。

答案 1 :(得分:1)

联合会发生的事情是其中定义的所有对象占用相同的内存。读取与最后写入的对象不同的对象是非法的。

union blah {
    int bleh;
    double blih;
    char bloh[42];
};
union blah myobject;

myobject包含intdoublechar[]中的一个。而且没有迹象表明哪一个是正确的。该指示必须由程序员保存在其他地方:

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本身和指示符变量分组到结构中,如示例所示。

管理层仍然必须由程序员编写。没有什么是自动的。