【问题标题】:C++ enum [string] errorC++ 枚举 [字符串] 错误
【发布时间】:2013-11-29 15:44:52
【问题描述】:

我使用枚举来声明变量的类型。但是,我在每个字符串上都收到一条错误消息:Error: expression must be an integral constant expression。如果我将"" 更改为'',五个字符或以上的单词会给出错误:Error: too many characters in a character constant。我该怎么办?

typedef enum
{
    INT = "int",
    STRING = "string",
    BOOLEAN = "bool",
    CHARACTER = "char",
    DOUBLE = "double",
    FLOAT = "float",
    LONG = "long",
    SHORT = "short"
} variable_types;

【问题讨论】:

  • 使用整型常量表达式,正如编译器错误提示的那样。
  • @juanchopanza - 我该怎么做?
  • @user2976089 最简单的方法?省略字符串。
  • 检查here
  • 我们可以用static const std::strings 的类来代替枚举吗?我开始回答这个问题,但我找不到使用这个的人的参考。

标签: c++ string enums quote


【解决方案1】:

enum 类型不是用来表示字符串的。如果您阅读了一些关于它的内容,您会注意到它仅在内部存储 int 类型。如果您需要映射这样的值,enum 并不是一个不错的选择。

如果您想保留语法,请使用#define 命令:

#define INT "int"
#define STRING "string"
...
#define SHORT "short"

您还可以将您当前的代码与std::map 结合起来:

#include <map>
typedef enum
{
    INT,
    STRING,
    ...
    SHORT
} enumeratedTypes;
map<enumeratedTypes,string> variable_types;
variable_types[INT] = "int";
variable_types[STRING] = "string";
...
variable_types[SHORT] = "short";

或者只是通过switch 语句检查事情,如果你需要它的功能:

string foo(enumeratedTypes type){
   int choice = type;
   switch(choice){
   case INT:
      return "int";
   case STRING:
      return "string";
   ...
   case SHORT:
      return "short";
   default:
      return "error";
 }

【讨论】:

    【解决方案2】:

    我不认为枚举可以映射到字符/字符串。您可以使用 std::map 将值映射到字符串值。

    How to easily map c++ enums to strings

    【讨论】:

    • 请注意,如果您不需要枚举具有特殊数值,则可以只使用矢量而不是地图(如链接中所建议的那样)。
    【解决方案3】:

    枚举必须是整数值。如果需要,您可以使用枚举值作为字符串数组的索引。

    像这样:

    #include <vector>
    #include <string>
    
    enum variable_types
    {
        INT,
        STRING,
        BOOLEAN,
        CHARACTER,
        DOUBLE,
        FLOAT,
        LONG,
        SHORT
    };
    
    // ...
    
    const std::vector<std::string> enumNames = { "int", "string", "bool", ... };
    variable_types someEnum = ...;
    auto enumName = enumNames[someEnum];
    

    【讨论】:

      【解决方案4】:

      据我所知,C/CPP 标准不支持字符串值枚举。枚举的值必须是整数(有符号无符号,长度取决于编译器)

      如果您将字符串放在 '' 标记中,这意味着该字符串应被解释为一个字符,并且 - 当然 - 一个字符具有一个整数值 (0-255)。由于标记中有多个字符,编译器会报错。

      【讨论】:

      • 最佳实践是将枚举值映射到字符串是创建一个结构: typedef struct { my_enum_type enumval; std::string enumstring} 然后你可以定义一个函数来查找字符串
      • 或者 - 如果您的枚举以 0 开头并且严格升序,您可以使用枚举来处理上述数组。但要小心,如果你添加一个枚举条目,你也必须添加一个结构数组条目,否则你可能会崩溃或得到一个无效的字符串
      猜你喜欢
      • 2011-11-02
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 2022-12-17
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多