[英]enum in struct: dereferencing pointer to incomplete type
我不确定我是否只是盲目,但是我在以下代码中得到了这个指向不完整类型的解引用指针:header:
enum foo {stuff1, stuff2, stuff3};
struct bar {
enum foo e;
int x;
int y;
};
包含标题的文件:
void func(struct bar *b) {
switch(b->e) {
...
}
}
该错误发生在切换线中,并且b上的代码完成仅向我提供整数x和y,而没有给我枚举。 当阅读此错误的其他人的问题时,我总是看到他们在尚未声明的地方使用某些东西。 但这不是事实。 那么为什么此代码无法编译?
有人要求提供有问题代码的完整示例。 所以就这样:h文件:
enum commandType {ADD_TREE, DEL_TREE, //tree
ADD_NODE, DEL_NODE, //node
ADD_SEGM, DEL_SEGM, //segment
ADD_SKEL, MRG_SKEL, DEL_SKEL, //skeleton
ADD_BRCH, JMP_BRCH, //branchpoint
ADD_COMM, DEL_COMM, //comment
CHG_NODE, CHG_TREE //change active
};
struct SkelCommand {
enum commandType type;
int32_t id;
int32_t prevActiveId;
};
c文件:
struct stack *undoStack = NULL;
void undo() {
//popStack returns a void*
struct skelCommand *cmd = (struct skelCommand*) popStack(undoStack);
switch(cmd->type) {
case ADD_TREE:
break;
case DEL_TREE:
break;
case ADD_NODE:
break;
case DEL_NODE:
break;
case ADD_SEGM:
break;
case DEL_SEGM:
break;
case ADD_SKEL:
break;
case MRG_SKEL:
break;
case DEL_SKEL:
break;
case ADD_BRCH:
break;
case JMP_BRCH:
break;
case ADD_COMM:
break;
case DEL_COMM:
break;
case CHG_NODE:
break;
case CHG_TREE:
break;
}
}
在另一个c文件中:
extern struct stack *undoStack;
void initialize() {
undoStack = newStack(4069);
}
错别字:
struct skelCommand *cmd = (struct skelCommand*) popStack(undoStack);
但struct
是SkelCommand
,大写S
:
struct SkelCommand
{
enum commandType type;
int32_t id;
int32_t prevActiveId;
};
因此错误,因为struct skelCommand
是不完整的类型。
您在结构中不需要enum关键字。
尝试:
struct bar { foo e; int x; int y; }
编辑:
上面是不正确 ,wildplasser是正确的。
实际的问题似乎是您的
func函数接受了
struct bar * b的事实。
我在VS2010中使用C文件进行了测试,删除
struct关键字可以解决您的问题。
例如:
void func(bar *b) { switch(b->e) { ... } }
更多编辑:
事实证明,MS认为C与实际C不相同(至少在VS2010中如此)。 请参阅下面的评论以获取正确答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.