C++ 枚举与静态常量

C++ 枚举与静态常量,c++,enums,c++03,C++,Enums,C++03,我目前正在考虑的问题是,是否最好使用带名称空间的枚举或带名称空间的静态常量组。 默认选择是什么?为什么 备选案文1: 备选案文2: 两者各有优缺点 专业枚举: 一些类型安全: void foo(Direction dir); // the compiler won't allow you to just pass an int or a value of an unrelated enum without explicitly casting it 反枚举: 类型安全性相当有限: enum

我目前正在考虑的问题是,是否最好使用带名称空间的枚举或带名称空间的静态常量组。 默认选择是什么?为什么

备选案文1: 备选案文2: 两者各有优缺点

专业枚举:
  • 一些类型安全:

    void foo(Direction dir); // the compiler won't allow you to just pass an int or a value of an unrelated enum without explicitly casting it
    
  • 反枚举:
  • 类型安全性相当有限:

    enum A
    {
        Entry1 = 1
    };
    
    enum B
    {
        Entry2 = 10
    };
    
    A a;
    if(a == Entry2)
        ; // ouch!
    
  • >P>不支持任何其他类型的int(在C++ 11之前,不能有一个枚举,例如长、短或char

  • 枚举的命名空间不理想

  • 如果不将枚举包装到单独的命名空间中,则其所有成员都将污染周围的命名空间

  • 如果确实将枚举包装到单独的命名空间中,则在将枚举本身用作类型时会得到一些冗余: 然后必须以direction::direction的方式声明一个direction变量(当不执行“using direction::direction”时,这会让它们再次污染外部名称空间(最后在代码的该部分,using指令在该部分生效)),以Direction::north的方式命名其成员,而不仅仅是north

  • 静态常数: C++之前11中C++中更好的类型支持——例如,可以使用常量的无符号字符类型
  • 正确的作用域-不污染外部名称空间,无需通过using指令明确要求它(甚至只在有限的范围内)
  • 反静态常数:
  • 与枚举相比,类型安全性更低-无法再声明这样的函数原型:

    void foo(Direction dir);
    
    但必须以以下方式进行:

    void foo(unsigned char dir); // now each variable of type unsigned char or of a type that can implicitly be casted into unsigned char can be passed, even if its totally unrelated to the expected "enumeration" or if the value does not match the value of any of the expected consts
    
  • 编辑: 在这里,我发现了一篇关于枚举类型安全性限制的有趣文章:
    最大的区别在于打字。枚举具有独特的类型; 静态常量必须具有现有的整型(尽管 它可以在其他地方使用)。哪一个更可取取决于 您想要的:在
    方向
    的情况下,您可能想要 一个唯一的类型,最好使用枚举。在其他情况下,什么 您真正想要的是一个具有整数类型的命名常量,例如 作为数组的维数。在这些情况下,静态常量是 可能更好

    C++11通过强类型枚举和改进的作用域,所有的反向枚举点


    对于一组固定值,比如你的基数方向的例子,我会使用枚举。< /p> 用枚举,你可以把所有属于一个概念的常量连在一起(用一个唯一的C++标识符命名为<代码> EnUM < /代码>)。p> Herb Sutter写了关于更喜欢新样式的强制转换(

    static_cast
    )而不是C强制转换的文章。他的一个论点(以及其他论点)是,可以在源代码中通过正则表达式找到它们


    回到你的问题,这意味着如果你使用
    enum
    ,你可以在你的代码库中搜索要一起使用的常量。对于命名空间中的常量,这是不可能的。

    枚举用于此目的,它们不占用内存(如果未使用),并且占用的方式较少。在第二个示例中,分配给
    north
    的是什么?使用
    enum
    可以使用默认值,也可以指定应使用的常量值。仅进行类型检查是值得的。别做其他选择。我不明白问题的重点。如果您正在枚举内容(如基数方向),并且您应该具有“类型安全性”,则使用
    enum
    s<代码>静态< /COD>变量是指其他所有问题的范围。AAONMAN:如果一个静态const只被引用,则它只占用内存,否则即使使用它也不占用任何内存。“在C++ 11…之前,没有任何其他类型的支持,而不是int”(即使在C++ 03中)是具有未指定基础类型的不同类型--此基础类型不必是
    int
    [dcl.enum]/5:“枚举的基础类型是整数类型,可以表示枚举中定义的所有枚举数值。实现定义了使用哪种整数类型作为枚举的基础类型,但基础类型不得大于
    int
    ,除非枚举数的值不能适合
    int
    无符号int
    。“想更详细地解释一下吗?C++11枚举是否保证具有特定的整数大小?枚举类型和枚举常量是否保证为同一类型?如果是这样的话,这将是Enum急需的重大改进。至少在C11中,枚举仍然像以前一样模糊。
    void foo(Direction dir);
    
    void foo(unsigned char dir); // now each variable of type unsigned char or of a type that can implicitly be casted into unsigned char can be passed, even if its totally unrelated to the expected "enumeration" or if the value does not match the value of any of the expected consts