簡體   English   中英

struct中的枚舉:取消引用不完整類型的指針

[英]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);

structSkelCommand ,大寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM