struct中的枚举:取消引用指向不完整类型的指针

时间:2012-07-18 11:29:05

标签: c enums struct

我不确定我是否只是盲目但我在下面的代码中得到了这个解除引用指向不完整类型的指针: 头:

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);
}

2 个答案:

答案 0 :(得分:1)

错字:

struct skelCommand *cmd = (struct skelCommand*) popStack(undoStack);

structSkelCommand,大写S

struct SkelCommand
{
    enum commandType type;
    int32_t id;
    int32_t prevActiveId;
}; 

因此错误,因为struct skelCommand是一个不完整的类型。

答案 1 :(得分:0)

你的结构中不需要enum关键字。

尝试:

struct bar {
    foo e;
    int x;
    int y;
}

修改:上述内容不正确且wildplasser正确无误。实际问题似乎是 func 函数接受结构栏* b 这一事实。我在VS2010中使用C文件进行了测试,删除 struct 关键字可以解决您的问题。例如:

void func(bar *b) {
    switch(b->e) {
    ...
    }
}

<击> 更多编辑:

证明MS认为C是什么,实际C是什么不相同(至少在VS2010中)。请参阅下面的评论以获得正确答案。