Является ли допустимым приведение `enum` к другому` enum` в [C]? - PullRequest
7 голосов
/ 12 марта 2011

У меня есть два перечисления.

enum A { A1=1, A2=2 }

enum B { B1=1, B2=2 }

Это допустимо по стандарту C?

A a = A1;
B b = a;

(скомпилировано с Clang, но я не уверен, что это стандарт илиповедение расширения)

Ответы [ 4 ]

6 голосов
/ 12 марта 2011

Стандарт действителен, но в спецификации C99 говорится, что некоторые реализации могут генерировать предупреждение:

Реализация может генерировать предупреждения во многих ситуациях, ни одна из которых не указана как часть этого международного стандарта.Стандарт.Ниже приведены некоторые из наиболее распространенных ситуаций:

  • Значение присваивается объекту перечисляемого типа, кроме как путем присвоения константы перечисления, являющейся членом этого типа, или перечисленияпеременная того же типа или значение функции, которая возвращает тот же перечислимый тип (6.7.2.2).
0 голосов
/ 12 марта 2011

valid - перечисления - это языковые функции, предназначенные для помощи разработчику.Если вы не укажете значения элементов перечисления, их значения будут сгенерированы автоматически. с другого языка .

0 голосов
/ 12 марта 2011

Это действительный стандарт С, но это плохая идея. Обратите внимание, что это не допустимый C ++.

0 голосов
/ 12 марта 2011

Я считаю, что в C перечисления в основном int с личностью.(Это отличается от C ++, где они являются полноценными типами.) Таким образом, присвоение различных enum s фактически все еще просто работает с int s, поэтому это законно.Однако я не говорю, что это рекомендуется:)

...