Безопасно ли использование enums во всех компиляторах? - PullRequest
1 голос
/ 12 апреля 2011

В обсуждении коллега сказал мне, что он никогда не использует enum, потому что он испытал, что некоторые C-компиляторы не справляются с оператором enum правильно.

Он не мог вспомнить, у какого именно компилятора были проблемы, но среди проблем были ошибки при выполнении чего-то вроде

enum my_enum{
  my_enum_first  = 5;
  my_enum_second = 10;
};

т.е. инициализация значений перечисления вместо того, чтобы позволить компилятору делать автоматическое присваивание. Еще один из них заключался в том, что компилятор сам решает, насколько велик enum, и поэтому вы можете иметь непредсказуемое поведение для sizeof my_enum при компиляции кода на различных платформах.

Чтобы обойти это, он сказал мне, чтобы лучше использовать #define s для определения постоянных элементов. Но особенно для использования doxygen очень удобно иметь enum (например, в качестве параметра функции), потому что в сгенерированной документации вы можете просто нажать на my_enum и сразу перейти к описанию my_enum.

Другим примером может служить завершение кода, когда ваша IDE сообщает вам, что вы можете указать в качестве допустимых параметров для функций. Я знаю это & ​​ndash; пока вы компилируете код в виде C-кода & ndash; что нет безопасности типов (то есть я мог бы также указать 5 вместо my_enum_first), поэтому использование enum кажется более косметическим.

Вопрос: знаете ли вы какие-либо компиляторы, которые имеют ограничения относительно использования enum?


Редактировать 1:
Что касается среды: мы разрабатываем для различных встроенных платформ, поэтому может также быть компилятором для некоторых неясных микроконтроллеров ...


Редактировать 2:
Он мог сказать мне, что компилятор KEIL C51 не очень хорошо работает с перечислениями. Есть ли опыт работы с текущими версиями компилятора C51 ?

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Компиляторы могут свободно выбирать размер перечисления в зависимости от диапазона возможных значений. Это действительно становится проблемой, только если вы представляете перечисления в своем API, и пользователи вашего кода могут использовать другой компилятор или опции сборки.

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

Вы можете обойти эту проблему, включив в свой список фиктивную запись для обеспечения минимального размера.

Например:

typedef enum {
    FirstValue = 12,
    SecondValue = 25,

    DummyValue = 65536  // force enum to be greater than 16 bits
} MyEnum;
4 голосов
/ 12 апреля 2011

Я почти уверен, что компилятор, который не очень хорошо работает с enum, является недопустимым компилятором - enum указан в стандарте, поэтому неудача в его реализации означает, что компилятор технически не должен использоваться для компиляции C (Для записи, область типов перечисления обсуждается в 6.2.1 и определяется как тип в 6.2.5 (из C99), поэтому можно предположить, что это допустимая часть стандарта с этого момента)!
Итакнет, я не знаю ни одного такого компилятора.

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