Развлечение с перечислениями: в C разрешено ли определять переменную как тип перечисления, а затем инициализировать переменную значением, не содержащимся в перечислении? - PullRequest
1 голос
/ 19 июня 2020

В следующем коротком примере кода переменная определяется как конкретный тип перечисления, а затем инициализируется значением, не содержащимся в этом типе перечисления. Это вообще разрешено? Если да, то есть ли для этого какие-либо веские причины? Спасибо!

typedef enum
{
  element_zero = 0;
  element_one = 1;
  element_two = 2;
} enum_triple;

typedef enum
{
  element_five = 5;
} enum_single;

enum_single return_value = (enum_single)element_zero;

1 Ответ

2 голосов
/ 19 июня 2020

Несколько вещей, которые следует помнить о C и философии программирования C:

  • Это продукт начала 1970-х годов;
  • Он был разработан в первую очередь для реализации * операционная система Unix;
  • Она избегает высокоуровневых абстракций в обмен на скорость;
  • Предполагается, что программист всегда знает, что он или она делает;
  • Предполагается, что программист лучше всех знает, нужно ли выполнять какие-либо границы или проверку диапазона, и достаточно умен, чтобы написать код для выполнения этой проверки;

Перечисления в C - удобный способ обозначения наборов значений, которые не обязательно упорядочены, но это все, что нужно. Они не являются абстракцией высокого уровня в C, как в Java или C#. Константы перечисления не привязаны к какому-либо конкретному c типу перечисления, и объекты перечисляемого типа могут принимать значения вне набора определенных для них констант перечисления.

Это больше удобство обозначений, чем что-либо еще.

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