2014-04-21 18 views
0

我想從C++頭文件中訪問枚舉並獲取錯誤,我想我可能只是以錯誤的方式來處理這個問題。從頭文件訪問枚舉時出錯

當我編譯程序時,我收到錯誤說我的枚舉沒有在這個範圍內聲明。

例如 : 「錯誤的基本沒有在這個範圍內聲明」:

tokenizer.h

typedef struct { 
    char *start; 
    enum { BASIC, SINGLE_QUOTE, DOUBLE_QUOTE, PIPE, SEMICOLON, EOL, ERROR } type; 
} aToken; 

simpleshell.cpp

void processLine(char *line) 
{ 
    enum { CMD, PIPED_CMD, ARGS } processMode; 
    processMode = CMD; 
    Statement *stmt = newStatement(); // Store the current statement 
    Command *cmd = NULL; 
    int doneFlag = 0; 
    char *expandedToken = NULL; 

    startToken(line); 
    aToken answer; 
    answer = getNextToken(); 

    while (!doneFlag) 
    { 
     switch (answer.type) 
     { 
     case ERROR: 
      ... // some code 
      return; 

     ... // other case statements 

     case PIPE: 
      ... // some code 
      break; 

     case EOL: 
      doneFlag = 1; 
     default: 
      fprintf(stderr, "Programming Error: Unrecognized type returned!!!\n"); 
      if (cmd != NULL) 
      { 
       freeCommand(cmd); 
       cmd = NULL; 
      } 
      if (stmt != NULL) 
      { 
       freeStatement(stmt); 
       stmt = NULL; 
      } 
      return; 
     } 
     answer = getNextToken(); 
    } 
} 

回答

2

「錯誤 'PIPE' 在此範圍內沒有宣佈」 你應該寫爲aToken::BASICaToken::PIPE等。枚舉被包含在aToken的範圍內。

+0

這有效。謝謝。 – Blinky

2

e.g. "error: BASIC was not declared in this scope" "error: ‘PIPE’ was not declared in this scope"

您忘記了應用結構作用域(aToken)。您將需要使用這樣的枚舉:

aToken::myEnumValue 

所以,你會寫你這樣的代碼:

switch (answer.type) 
    { 
    case aToken::ERROR: 
    // ^^^^^^^^ 
     ... // some code 
     return; 

    ... // other case statements 

    case aToken::PIPE: 
    // ^^^^^^^^ 
     ... // some code 
     break; 

    case aToken::EOL: 
    // ^^^^^^^^ 
     doneFlag = 1; 
    default: 
     fprintf(stderr, "Programming Error: Unrecognized type returned!!!\n"); 
     if (cmd != NULL) 
     { 
      freeCommand(cmd); 
      cmd = NULL; 
     } 
     if (stmt != NULL) 
     { 
      freeStatement(stmt); 
      stmt = NULL; 
     } 
     return; 
    } 

話雖這麼說,你應該考慮枚舉類,如果你有C++ 11支持。在這種情況下,您還需要添加枚舉類作用域,如下所示:

aToken::MyEnumClass::myEnumValue