【问题标题】:C/C++ Create an enum with negative values, without having to number itC/C++ 创建一个带有负值的枚举,而不必对其编号
【发布时间】:2014-01-09 17:37:40
【问题描述】:

例如在 C/C++ 中,我会得到以下代码:

typedef enum fruits{
   apple,
   banana,
   lemon,
   orange
} fruit_t;

相当于:

typedef enum fruits{
   apple = 0,
   banana = 1,
   lemon = 2,
   orange = 3
} fruit_t;

但是,我希望这些值是负数,这样它们就不会与其他任何东西发生冲突。我可以这样做:

typedef enum fruits{
   apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;

但是如果我想添加另一个水果,我必须分配另一个值,如果我在中间放一个,我必须重新编号。有没有更简单的方法?

【问题讨论】:

  • 您应该使用 C++11 范围的枚举。没有 C/C++ 这样的东西。
  • @LightnessRacesinOrbit:除非打算编写一个可以在任何一种语言中使用的定义;在这种情况下,称它为“C/C++”是很合理的。

标签: c++ c enums


【解决方案1】:

INT_MIN 开头,如下所示:

#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}

根据 C11 标准 INT_MIN 的“5.2.4.2.1 整数类型的大小”和/或“附件 E/1”至少为 @987654324 @。

INT_MIN 通过包含&lt;limits.h&gt; 来定义。

【讨论】:

    【解决方案2】:

    C中,你只需要对最上面的一个进行编号,随后的条目将是前一个条目+1,这在C99 draft standard部分6.7.2.2中进行了介绍枚举说明符 表示(强调我的):

    [...]带 = 的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有 =,则其枚举常数的值为 0。后面的每个没有 = 的枚举数都将其枚举常数定义为常数表达式的值,该值加 1上一个枚举常量。[...]

    并且在C++ draft standard 部分7.2 枚举声明 段落2 中的措辞相似。

    所以只需执行类似以下的操作:

    #define MIN -4
    
    typedef enum fruits{
       orange = MIN,
       lemon,  
       banana,
       apple,
    } fruit_t;
    

    【讨论】:

      【解决方案3】:

      首先,没有“C/C++”之类的东西,它们是两种不同的语言。 您不能将 C 视为 C++ 的子集。一些合法的 C 代码不会编译为 C++ 程序。

      如果你可以使用 C++11,我建议你使用enum class,它为你提供强类型枚举

      enum class Traffic {red , yellow, green};
      Traffic t = Traffic::red;
      
      if ( t == Traffic::red )  // to test the value of an enum 
      

      这样可以保证没有冲突,因为编译器不会让你与整数或不同枚举类型的变量进行任何比较。

      您只能与相同枚举类型的变量进行比较,或使用示例中的二进制范围解析运算符。

      enum class 的另一个优点是您可以设置枚举的大小。您可以像这样使用任何有符号或无符号整数类型:

      enum class Traffic : char { red, yellow, green }
      

      当未指定类型时,默认为int

      请注意,您需要一个支持 C++11 的编译器。

      【讨论】:

        【解决方案4】:

        在顶部添加新闻。你仍然需要给最上面的一个编号。

        enum fruit
        {
           orange = -4,
           lemon,
           banana,
           apple,
        };
        

        【讨论】:

          【解决方案5】:

          我想你可以随心所欲地订购它。

          如果您没有给出任何值,那么下一个enum 将采用其先前值的+1。如果连拳头enum 都没有任何价值,那么它将从0 开始。

          但好的做法是按正确的顺序排列。

          【讨论】:

            【解决方案6】:

            将错误声明为通常的枚举和 使用它的负值,例如:

            typedef enum fruits_e {
                APPLE=1,
                BANANA,
                LEMON,
                ORANGE
            } fruit_t;
            
            fruit_t eat_fastfood(void) {
                if (! me->healthy())
                    return -APPLE;
            }
            

            【讨论】:

            • 如果一个函数返回一个枚举,我希望它返回枚举中实际定义的值,所以我可以这样做switch(eat_fastFood()) { case APPLE: case BANANA: case LEMON: case ORANGE: break; } - 我从没想过需要否定我的案例(希望这个至少记录在某处,否则我只能在我的程序没有按预期工作后通过调试或记录/打印值来发现)。
            猜你喜欢
            • 2010-10-22
            • 2011-06-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-13
            • 2021-04-11
            • 2017-03-10
            相关资源
            最近更新 更多