реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как в C заставить enum считаться беззнаковым?
ViKo
сообщение Oct 5 2017, 09:38
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

В С++ вижу вариант enum : uint32_t { }.
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 5 2017, 10:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(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 например)

Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 5 2017, 10:20
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Тогда компилятор пишет прямо на перечисление предупреждение
warning: #66-D: enumeration value is out of "int" range
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 5 2017, 10:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Тогда увы, будет int sad.gif
Go to the top of the page
 
+Quote Post
Эдди
сообщение Oct 5 2017, 10:59
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Не взлетит. Единственный вариант — что-то вроде такого
Код
#define STATE_OK      ((uint32_t)0)
#define STATE_ERR1  ((uint32_t)1)
...

Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 5 2017, 11:34
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

Давайте к нам, в плюсы!
Там ещё много вкусностей есть :-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 5 2017, 12:02
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(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

Go to the top of the page
 
+Quote Post
Эдди
сообщение Oct 5 2017, 12:39
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Не думаю, что только ради этого стоит кошерную сишечку на с++ менять...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 5 2017, 12:47
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А как задать в Кейле (для файла) опцию, чтобы он стандарт C++11 принимал без предупреждения. Что ни добавляю (-std=c++11), не получается.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 5 2017, 18:22
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте --cpp11 (нагуглил)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 5 2017, 18:38
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Там, похоже, перекрываются ключи, общие для всего проекта (не мой) и конкретного файла. Оставлю пока, как есть.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 6 2017, 10:22
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Проверил ключик --cpp11 - действительно, подавляет предупреждение! Спасибо!!
То, что я выше пытался задать - это ARM Compiler 6 option. Я использую 5. В Кейле в Помощи есть, надо только знать, где (и что ;-) ) искать.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 6 2017, 20:32
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Завтра проверю, но вроде ж была возможность в Keil задавать опции для файла отдельно
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 7 2017, 06:54
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я уже проверил. Работает. Но общие опции проекта для одиночного файла удалить невозможно, можно только своих добавить.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2025 - 00:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01489 секунд с 7
ELECTRONIX ©2004-2016