ViKo 1 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба В C (не C++) имею тип - перечисление с числами от 0 до 3. Имею макрофункцию, где переменная типа того перечисления сдвигается на 30 влево. При компиляции всплывает предупреждение, что результат выходит за пределы целого (в бит знака передвигается число). Могу избавиться, дополнив ту же переменную в макрофункции явным приведением типа. Что странно - не результат сдвига, а саму переменную. И все чисто. Но хотел бы прямо в перечислении задать беззнаковое целое. Явное задание чисел и дополнение ULL не помогает. Можно заменить typedef enum { } на #define с дополнениями ULL, думаю, предупреждений не было бы. Не нравится. В С++ вижу вариант enum : uint32_t { }. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Но хотел бы прямо в перечислении задать беззнаковое целое.Насколько я помню стандарт С, там сказано, что 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 1 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Попробуйте ему добавить в enum константу, которая не влезает в int (0xFFFFFFFFu например) Тогда компилятор пишет прямо на перечисление предупреждение warning: #66-D: enumeration value is out of "int" range Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Тогда увы, будет int :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Не взлетит. Единственный вариант — что-то вроде такого #define STATE_OK ((uint32_t)0) #define STATE_ERR1 ((uint32_t)1) ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба В С++ вижу вариант enum : uint32_t { }. Давайте к нам, в плюсы! Там ещё много вкусностей есть :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Давайте к нам, в плюсы! Там ещё много вкусностей есть :-) Да, пора. Изменил расширение файла на .cpp, дописал в typedef enum : unsigned { } Получил другое предупреждение: warning: #3641-D: explicit enum base types are a C++11 feature Так нравится больше. Вот с этим обрамлением в заголовочном файле: #ifdef __cplusplus extern "C" { #endif инклюды здесь прототипы здесь #ifdef __cplusplus } #endif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Не думаю, что только ради этого стоит кошерную сишечку на с++ менять... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба А как задать в Кейле (для файла) опцию, чтобы он стандарт C++11 принимал без предупреждения. Что ни добавляю (-std=c++11), не получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Попробуйте --cpp11 (нагуглил) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 5 октября, 2017 Опубликовано 5 октября, 2017 · Жалоба Там, похоже, перекрываются ключи, общие для всего проекта (не мой) и конкретного файла. Оставлю пока, как есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 6 октября, 2017 Опубликовано 6 октября, 2017 · Жалоба Проверил ключик --cpp11 - действительно, подавляет предупреждение! Спасибо!! То, что я выше пытался задать - это ARM Compiler 6 option. Я использую 5. В Кейле в Помощи есть, надо только знать, где (и что ;-) ) искать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 6 октября, 2017 Опубликовано 6 октября, 2017 · Жалоба Завтра проверю, но вроде ж была возможность в Keil задавать опции для файла отдельно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2017 Опубликовано 7 октября, 2017 · Жалоба Я уже проверил. Работает. Но общие опции проекта для одиночного файла удалить невозможно, можно только своих добавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться