Какой тип возврата enum |? - PullRequest
       3

Какой тип возврата enum |?

1 голос
/ 24 ноября 2010
enum FileOpenFlags
{
    FileOpenFlags_Create = 1,
    FileOpenFlags_Truncate = 2,
};


FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;

Верно ли, что тип возврата enum | также enum ??

Ответы [ 6 ]

2 голосов
/ 24 ноября 2010

нет, это не так, и с на самом деле все равно. Вы все еще можете присвоить его перечислению, даже если значение, возвращаемое enum | enum is не совпадает со значением любого из перечисленных вами enum.

Все они являются целыми, если речь идет о c

2 голосов
/ 24 ноября 2010

Нет, вышеприведенное выражение будет иметь тип int. Однако, поскольку enum s без проблем преобразуется в int и обратно, он затем неявно преобразуется обратно в enum для магазина.

См. Также эту запись FAQ по comp.lang.c .

1 голос
/ 24 ноября 2010

В этом случае вам не следует сохранять объединение этих двух обратно в тип enum - поскольку новое значение не является допустимым значением для этого перечисления! Вместо этого сохраните их в int.

В качестве альтернативы взгляните на типы полей бит (википедия)

struct FOF {
  int Create : 1;
  int Truncate : 1;
};
1 голос
/ 24 ноября 2010

Я обычно определяю флаги, используя #define,

#define FLAG_1 0x1
#define FLAG_2 0x2
#define FLAG_3 0x4

...

Если вы используете перечисления и хотите иметь отдельные флаги, которые можно объединять или объединять, вы должны будете назначитьим значение с помощью оператора '='.

1 голос
/ 24 ноября 2010

Значение перечисления является просто целым числом, и операции со значениями перечисления не гарантированно возвращают определенное значение перечисления.

0 голосов
/ 24 ноября 2010

Я думаю, что это действительно так, (int)3 должно быть возвращено в вашем примере.

Насколько мне известно, C рассматривает значения перечисления как тип int через внутреннее приведение или что-то в этом духе. С перечислениями дело в том, что в C ++ они не могут быть LVALUE операции (потому что они не рассматриваются как числа), поэтому вы не можете увеличивать их или присваивать им значения. OTOH, вы всегда можете использовать их как RVALUE (как в C, так и в C ++), поэтому:

int flags = FileOpenFlags_Create | FileOpenFlags_Truncate; 

действует как на C, так и на C ++, а

FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;

, вероятно, будет работать в C, но с треском провалится в C ++;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...