当前位置:  开发笔记 > 编程语言 > 正文

枚举中的元素数量

如何解决《枚举中的元素数量》经验,为你挑选了5个好方法。

在C中,是否有一种很好的方法来跟踪枚举中的元素数量?我见过

enum blah {
    FIRST,
    SECOND,
    THIRD,
    LAST
};

但这仅在项目是连续的并且从零开始时才有效.



1> vpicaver..:

如果你没有分配你的枚举,你可以做这样的事情:

enum MyType {
  Type1,
  Type2,
  Type3,
  NumberOfTypes
}

NumberOfTypes将评估为3,这是真实类型的数量.


晚期回答@JohnyTex,但C标准在'枚举说明符'中提到:`如果第一个枚举器没有=,则其枚举常量的值为0.每个后续枚举数为no =将其枚举常量定义为常量的值通过在前一个枚举常量的值上加1得到的表达式.所以是的,这适用于任何符合标准的实现.
好招!显然是最简单的枚举枚举
您是否始终可以确保在每个C实现中,枚举始终从0开始?我这么认为,但它总是如此真实吗?

2> Brian Campbe..:

我不相信有.但是,如果这些数字不是连续的,你会用这个数字做什么呢?你还没有在某个地方列出这些数字?如果它们是连续的但是从不同的数字开始,你可以随时做:

enum blah {
    FIRST = 128,
    SECOND,
    THIRD,
    END
};
const int blah_count = END - FIRST;


不,你会得到FIRST = -9 SECOND = -8 THIRD = -7 END = -6,所以你有-6 - ( - 9)= -6 + 9 = 3
无需提防; 减法适用于负数.Pax说得对.

3> Sam..:

老问题,我知道.这是针对具有相同问题的googlers.

你可以使用X-Macros

例:

//The values are defined via a map which calls a given macro which is defined later
#define ENUM_MAP(X) \
      X(VALA, 0)    \
      X(VALB, 10)   \
      X(VALC, 20)

//Using the map for the enum decl
#define X(n, v) [n] = v,
typedef enum val_list {
    ENUM_MAP(X) //results in [VALA] = 0, etc...
} val_list;
#undef X

//For the count of values
#define X(n, v) + 1
int val_list_count = 0 + ENUM_MAP(X); //evaluates to 0 + 1 + 1 + 1
#undef X

这对IDE也是透明的,因此自动完成将正常工作(因为它完全在预处理器中完成).



4> rlbond..:

很不幸的是,不行.那没有.



5> David Stosik..:

我知道这是一个非常古老的问题,但由于接受的答案是错误的,我觉得有必要发布我自己的问题.我将重用已接受的答案的示例,稍加修改.(假设枚举是连续的.)

// Incorrect code, do not use!
enum blah {
  FIRST   =  0,
  SECOND, // 1
  THIRD,  // 2
  END     // 3
};
const int blah_count = END - FIRST;
// And this above would be 3 - 0 = 3, although there actually are 4 items.

任何开发者都知道原因:count = last - first + 1.这适用于任何符号组合(两端为负,均为正,或仅为第一端为负).你可以试试.

// Now, the correct version.
enum blah {
  FIRST   =  0,
  SECOND, // 1
  THIRD,  // 2
  END     // 3
};
const int blah_count = END - FIRST + 1; // 4

编辑:再次阅读文本,我有一个疑问.这是否END意味着不属于所提供的项目?这对我来说很奇怪,但是,我想这可能有意义......

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有