在C中使用枚举联合

时间:2016-09-09 19:58:13

标签: c enums unions

我正在使用指向状态机中函数的指针,并且需要传递一个枚举值,该值是从枚举联合构建的。当我使用带有函数调用的表时,我需要它们的调用/返回值来匹配。我试图在我的本地盒子和CodeChef上使用GCC C 4.9.2构建它。使用codeChef我得到错误:

  

prog.c:在函数' main':prog.c:12:15:错误:预期的表达式   之前' FOO' NewFooState(FOO.D); //<<<<<<<这是什么   失败!!

typedef enum Foo_t {A, B, C, D} FOO;
typedef enum Bar_t {E, F, G} BAR;


typedef union FooBar_t {FOO Foo; BAR Bar;} FooBar;

FooBar NewFooState(FooBar NewState);

//I want to later make call such as

int main(){
  NewFooState(FOO.D);       // <<<<<< This is what fails!!
  return 0;
}
//and have that function look like:

FooBar NewFooState(FooBar NewState){
  static FooBar oldState = {.Foo=A};
  FooBar ReturnValue = oldState;
  oldState = NewState;
  switch (NewState.Foo){
      case A:
      case B:
      case C:
      case D:
        //stuff
        break;
  }
  return ReturnValue ;
}

请注意初始化oldState所需的特定方式:

  

static FooBar oldState = {.Foo = A};

我的问题似乎是使用枚举值,例如 FooBar.Bar.G 我已经尝试了所有看起来很明显的语法组合,例如{.Foo = G}, FooBar_t.Bar.G,Bar.G,G等,但我不能让编译器接受它。我只想使用其中一个枚举值,如F,并调用NewFooState函数,如NewFooState(F)。应该这么简单...... 使用NewFooState(G)我得到错误错误[Pe167]:类型&#34;枚举G&#34;的参数与&#34; FooBar&#34;

类型的参数不兼容

1 个答案:

答案 0 :(得分:1)

没有FOO.D之类的东西。 D是其自己的标识符,用于指定与FOO关联的枚举值。但是,您的NewFooState()函数需要FooBar,而不是FOO(也不是BAR)。所以,你需要一个适当类型的变量。一种方法可以做到:

  FooBar FOO_D = { .Foo=D };
  NewFooState(FOO_D);