首页 > 解决方案 > 枚举类在 C++ 中不接受带有连字符/破折号的文本

问题描述

我正在创建一个enum class但 Eclipse 中的 CDT 编译器抛出错误,因为我的常量列表有连字符。我无法避免连字符/破折号,因为它是产品代码的一部分。有解决方法吗?

enum class ProductCode{
   JELLY-BEANS,
   SALE,
   TWISTED-TWIRLS,
   5-STARS
}

标签: c++classenumssyntax-erroreclipse-cdt

解决方案


在 C++ 语言中,连字符 ( -) 不能是标识符的一部分。

标识符是任意长的数字序列、下划线、小写和大写拉丁字母以及大多数 Unicode 字符。它必须以下划线或字母开头。另请参阅cppreference/Identifiers

通常,下划线 ( _) 字符用于宏和枚举常量等标识符中:

enum class ProductCode {
   JELLY_BEANS,
   SALE,
   TWISTED_TWIRLS,
   FIVE_STARS // this also can't start with '5'
}

枚举常量不存储文本,因此它们不需要像您的产品代码那样完全格式化。要将枚举常量转换为您的产品代码,您可以执行以下操作:

#include <map>

constexpr const char* textOf(ProductCode code) {
    switch (code) {
        case ProductCode::JELLY_BEANS: return "JELLY-BEANS";
        case ProductCode::SALE: return "SALE";
        case ProductCode::TWISTED_TWIRLS: return "TWISTED-TWIRLS";
        case ProductCode::FIVE_STARS: return "5-STARS";
    }
}

ProductCode codeOf(const std::string &str) {
    static const std::map<std::string, ProductCode> map{
        {textOf(ProductCode::JELLY_BEANS), ProductCode::JELLY_BEANS},
        {textOf(ProductCode::SALE), ProductCode::SALE},
        {textOf(ProductCode::TWISTED_TWIRLS), ProductCode::TWISTED_TWIRLS},
        {textOf(ProductCode::FIVE_STARS), ProductCode::FIVE_STARS}
    };
    return map.at(str);
}

推荐阅读