Типы перечисления в (Objective-) C являются очень слабыми типами. Согласно стандарту C каждая константа перечисления (ваш january
и т. Д.) Имеет целочисленный тип, не тип перечисления. Кроме того, значение типа перечисления неявно преобразуется в целочисленный тип при необходимости.
Clang выдает предупреждение, когда оба операнда имеют тип перечисления, и это всего лишь предупреждение , так как по стандарту C сравнение является правильным, когда между целочисленными значениями.
В вашем DaySunday == january
левый операнд имеет целочисленный тип, правый операнд неявно преобразуется в целочисленный тип, поэтому, опять же, это вполне допустимый и правильный стандарт C. Clang может выбрать для выдачи предупреждения, Вероятно, причина этого заключается не в конструктивном решении или следствии замысла внутри Clang.
Будьте благодарны, Clang часто дает предупреждения, когда Стандарт C не требует их, однако вы не можете полагаться на него, показывая все ловушки в C.
Чтобы решить вашу проблему, вы можете привести литерал к типу enum, если хотите, (Day)DaySunday == january
, но вы можете разумно решить, что это делает C еще хуже; -)