繁体   English   中英

在 C 中使用枚举联合

[英]Using Unions of enums in C

我在状态机中使用指向函数的指针,需要传递一个从枚举联合构建的枚举值。 当我使用带有函数调用的表时,我需要它们的调用/返回值匹配。 我试图在我的本地机器和 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 所需的特定方式:

静态 FooBar oldState = {.Foo=A};

我的问题似乎是使用枚举值,例如FooBar.Bar.G我已经尝试了所有对我来说显而易见的语法组合,例如 {.Foo=G}、FooBar_t.Bar.G、Bar.G、G,等等,但我无法让编译器接受它。 我只想使用枚举值之一(例如 F)并调用 NewFooState 函数,例如 NewFooState(F)。 应该如此简单......使用 NewFooState(G) 我收到错误 Error[Pe167]: “enum G”类型的参数与“FooBar”类型的参数不兼容

没有FOO.D这样的东西。 D是它自己的标识符,它指定与FOO关联的枚举值。 但是,您的NewFooState()函数需要FooBar ,而不是FOO (也不是BAR )。 因此,您需要一个正确类型的变量。 一种方法可以做到这一点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM