Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как в C заставить enum считаться беззнаковым?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
ViKo
В C (не C++) имею тип - перечисление с числами от 0 до 3.
Имею макрофункцию, где переменная типа того перечисления сдвигается на 30 влево.
При компиляции всплывает предупреждение, что результат выходит за пределы целого (в бит знака передвигается число).
Могу избавиться, дополнив ту же переменную в макрофункции явным приведением типа. Что странно - не результат сдвига, а саму переменную. И все чисто.
Но хотел бы прямо в перечислении задать беззнаковое целое. Явное задание чисел и дополнение ULL не помогает.
Можно заменить typedef enum { } на #define с дополнениями ULL, думаю, предупреждений не было бы. Не нравится.

В С++ вижу вариант enum : uint32_t { }.
XVR
Цитата(ViKo @ Oct 5 2017, 12:38) *
Но хотел бы прямо в перечислении задать беззнаковое целое.
Насколько я помню стандарт С, там сказано, что 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 например)

ViKo
Цитата(XVR @ Oct 5 2017, 13:15) *
Попробуйте ему добавить в enum константу, которая не влезает в int (0xFFFFFFFFu например)

Тогда компилятор пишет прямо на перечисление предупреждение
warning: #66-D: enumeration value is out of "int" range
XVR
Тогда увы, будет int sad.gif
Эдди
Не взлетит. Единственный вариант — что-то вроде такого
Код
#define STATE_OK      ((uint32_t)0)
#define STATE_ERR1  ((uint32_t)1)
...

AHTOXA
Цитата(ViKo @ Oct 5 2017, 14:38) *
В С++ вижу вариант enum : uint32_t { }.

Давайте к нам, в плюсы!
Там ещё много вкусностей есть :-)
ViKo
Цитата(AHTOXA @ Oct 5 2017, 14:34) *
Давайте к нам, в плюсы!
Там ещё много вкусностей есть :-)

Да, пора.
Изменил расширение файла на .cpp, дописал в typedef enum : unsigned { }
Получил другое предупреждение:
warning: #3641-D: explicit enum base types are a C++11 feature
Так нравится больше.

Вот с этим обрамлением в заголовочном файле:
#ifdef __cplusplus
extern "C" {
#endif

инклюды здесь
прототипы здесь

#ifdef __cplusplus
}
#endif

Эдди
Не думаю, что только ради этого стоит кошерную сишечку на с++ менять...
ViKo
А как задать в Кейле (для файла) опцию, чтобы он стандарт C++11 принимал без предупреждения. Что ни добавляю (-std=c++11), не получается.
AHTOXA
Попробуйте --cpp11 (нагуглил)
ViKo
Там, похоже, перекрываются ключи, общие для всего проекта (не мой) и конкретного файла. Оставлю пока, как есть.
ViKo
Проверил ключик --cpp11 - действительно, подавляет предупреждение! Спасибо!!
То, что я выше пытался задать - это ARM Compiler 6 option. Я использую 5. В Кейле в Помощи есть, надо только знать, где (и что ;-) ) искать.
toweroff
Завтра проверю, но вроде ж была возможность в Keil задавать опции для файла отдельно
ViKo
Я уже проверил. Работает. Но общие опции проекта для одиночного файла удалить невозможно, можно только своих добавить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.