【发布时间】: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.D或Foo_t.D这样的东西。您所做的就是定义A=0、B=1、C=2和D=3。还有E=0、F=1和G=2。创建一个包含FOO和BAR成员的联合只会造成麻烦。