Кстати, Бьярн Страуструп говорит о том, что enum
s вводит в C ++ в своей книге Дизайн и эволюция C ++ с утверждением "Перечисления C представляют собой любопытно недоделанную концепцию. Перечисления не были часть первоначальной концепции C и, по-видимому, неохотно вводились в язык как уступка людям, которые настаивали на получении формы символических констант, более существенных, чем макросы Cpp без параметров ». (раздел 11.7, «Cpp» относится к препроцессору C, в остальной части раздела рассказывается о решении сделать каждый enum
отдельным типом в C ++ вместо того, чтобы все они были int
s, как они изначально были в C и ранее. версии C ++).
enum
s в основном предназначены для замены #define
s в более ранних версиях C.
// based on UNIX file permissions
#define EXECUTE 1
#define WRITE 2
#define READ 4
против
const int EXECUTE = 1;
const int WRITE = 2;
const int READ = 4;
против
enum File_perms {
EXECUTE = 1;
WRITE = 2;
READ = 4;
};
То, что использовать, во многом зависит от личного вкуса . enum
предоставляет форму документации о том, какие значения должна содержать переменная:
int permissions = 4; // Was that file permissions, database permissions, or something else?
File_perms perms = 4;
Это особенно полезно в сигнатурах функций:
int fiddle_bits(int, int); // I can never remember if I pass the file permissions as the first or second parameter ...
File_perms fiddle_bits2(File_perms, int);
enum
с разрешено в switch
выражении case
метках (как и #define
с и const int
с):
switch (perm) {
case READ:
...
break;
...
}
Тем не менее, обратите внимание, что является возможным присваивать номера enum
s, которые не имеют помеченного значения (C ++ 0x добавляет enum class
, который не позволяет этого):
File_perms perm = 7; // a.k.a., File_perms perm = EXECUTE | READ | WRITE;
Если вы когда-нибудь увидите enum
с явными значениями, которые являются степенями 2, вы можете почти гарантировать, что он будет использоваться таким образом.