Перейти к содержанию
    

Как в C заставить enum считаться беззнаковым?

В C (не C++) имею тип - перечисление с числами от 0 до 3.

Имею макрофункцию, где переменная типа того перечисления сдвигается на 30 влево.

При компиляции всплывает предупреждение, что результат выходит за пределы целого (в бит знака передвигается число).

Могу избавиться, дополнив ту же переменную в макрофункции явным приведением типа. Что странно - не результат сдвига, а саму переменную. И все чисто.

Но хотел бы прямо в перечислении задать беззнаковое целое. Явное задание чисел и дополнение ULL не помогает.

Можно заменить typedef enum { } на #define с дополнениями ULL, думаю, предупреждений не было бы. Не нравится.

 

В С++ вижу вариант enum : uint32_t { }.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но хотел бы прямо в перечислении задать беззнаковое целое.
Насколько я помню стандарт С, там сказано, что enum эквивалентен int (а не unsigned).

 

Угу, нашел (С99):

 

6.7.2.2 Enumeration specifiers

 

Semantics

3

The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.

 

Хотя:

4

Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type 110).

The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration.

 

110: An implementation may delay the choice of which integer type until all enumeration constants have been seen.

Попробуйте ему добавить в enum константу, которая не влезает в int (0xFFFFFFFFu например)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте ему добавить в enum константу, которая не влезает в int (0xFFFFFFFFu например)

Тогда компилятор пишет прямо на перечисление предупреждение

warning: #66-D: enumeration value is out of "int" range

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не взлетит. Единственный вариант — что-то вроде такого

#define STATE_OK      ((uint32_t)0)
#define STATE_ERR1  ((uint32_t)1)
...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В С++ вижу вариант enum : uint32_t { }.

Давайте к нам, в плюсы!

Там ещё много вкусностей есть :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте к нам, в плюсы!

Там ещё много вкусностей есть :-)

Да, пора.

Изменил расширение файла на .cpp, дописал в typedef enum : unsigned { }

Получил другое предупреждение:

warning: #3641-D: explicit enum base types are a C++11 feature

Так нравится больше.

 

Вот с этим обрамлением в заголовочном файле:

#ifdef __cplusplus

extern "C" {

#endif

 

инклюды здесь

прототипы здесь

 

#ifdef __cplusplus

}

#endif

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не думаю, что только ради этого стоит кошерную сишечку на с++ менять...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как задать в Кейле (для файла) опцию, чтобы он стандарт C++11 принимал без предупреждения. Что ни добавляю (-std=c++11), не получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там, похоже, перекрываются ключи, общие для всего проекта (не мой) и конкретного файла. Оставлю пока, как есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил ключик --cpp11 - действительно, подавляет предупреждение! Спасибо!!

То, что я выше пытался задать - это ARM Compiler 6 option. Я использую 5. В Кейле в Помощи есть, надо только знать, где (и что ;-) ) искать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Завтра проверю, но вроде ж была возможность в Keil задавать опции для файла отдельно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...