0

我不确定我是否只是盲人,但我在以下代码中得到了这个指向不完整类型的解引用指针:标题:

enum foo {stuff1, stuff2, stuff3};

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

包含标头的文件:

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

错误发生在 switch 行中,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);
}
4

2 回答 2

1

错字:

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

但是structSkelCommand,大写S

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

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

于 2012-07-18T12:29:37.323 回答
0

您的结构中不需要 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 中)。请参阅下面的评论以获取正确答案。

于 2012-07-18T11:38:35.347 回答