【问题标题】:Using Unions of enums in C在 C 中使用枚举的联合
【发布时间】:2016-09-09 19:58:13
【问题描述】:

我在状态机中使用指向函数的指针,并且需要传递一个由枚举联合构建的枚举值。当我使用带有函数调用的表时,我需要它们的调用/返回值匹配。我试图在我的本地盒子和 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”类型的参数不兼容

【问题讨论】:

  • G 不是一个字段,它是它自己的标识符。
  • NewFooState(G) 给你什么编译错误?
  • jxh,奇怪的是,打开 NewState 似乎可以正常编译和工作。
  • 请更新您的问题,向我们展示您的实际代码。您的联合类型有一个类型为 Foo_t 的成员。有Foo 类型和enum Foo_t 类型,但没有Foo_T 类型(除非您将代码编译为C++,在这种情况下您需要更新标签)。 OldState = NewState 上缺少分号。鉴于这样的错误,不可能说出实际问题是什么。见minimal reproducible example
  • C 中没有命名空间。所以没有FOO.DFoo_t.D 这样的东西。您所做的就是定义A=0B=1C=2D=3。还有E=0F=1G=2。创建一个包含FOOBAR 成员的联合只会造成麻烦。

标签: c enums unions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多