簡體   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