从头文件访问枚举时出错

Errors when accessing enums from a header file

本文关键字:出错 枚举 访问 文件      更新时间:2023-10-16

我试图从c++中的头文件访问枚举,但遇到了错误,我想我可能只是以错误的方式处理了这个问题。

当我编译程序时,我会收到错误,说我的枚举没有在这个范围内声明。

例如"错误:BASIC未在此范围内声明"错误:未在此范围中声明'PIPE'"

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

您应该将其写成aToken::BASICaToken::PIPE等。枚举包含在aToken的作用域中。

例如"错误:未在此范围中声明BASIC"错误:在此范围中未声明PIPE"

您忘记应用结构作用域(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