В Visual Studio 2010 я смог построить перечисление с типом данных просто отлично.
enum FRUIT_E : UINT16
{
APPLE = 0,
LEMON = 1,
GRAPE = 2,
};
Однако, когда я пытался скомпилировать в WR Workbench, я получаю следующую ошибку:
: ошибка: использование enum ‘FRUIT_E’ без предварительного объявления
Мне действительно нужно указать тип данных enum, поскольку поля упакованы в битовый формат. Есть ли способ, которым я мог бы явно указать тип перечисления?
Краткий ответ на ваш вопрос — нет.
Возможность определения базового типа для перечислений — это языковая функция, которая не была добавлена до C ++ 11 (http://en.cppreference.com/w/cpp/language/enum). К сожалению, WindRiver не спешил поддерживать компиляторы, которые соответствуют современным стандартам C ++ (C ++ 11 в vxworks). Есть упоминание о поддержке C ++ 11 в коммерческих версиях g ++ для VxWorks 7.0+ (https://stackoverflow.com/a/36311473). Но ваша версия WorkBench (<4.0) подразумевает, что это не поможет вам.
В вашей ситуации я мог бы объединить обходной путь, такой как этот:
namespace FRUIT_E
{
static const UINT16 APPLE = 0;
static const UINT16 LEMON = 1;
static const UINT16 GRAPE = 2;
}
typedef FRUIT_T UINT16;
...
FRUIT_T fruit = FRUIT_E::APPLE;
Однако это не обеспечит безопасность типов, поскольку FRUIT_T — это просто псевдоним для UINT16. Так что это далеко от идеала. Я добавил теги к вашему вопросу. Там могут быть лучшие обходные пути, более близко подражая желаемому поведению. Но добавление новой языковой функции, казалось бы, указывает на то, что существующие методы были неадекватными.
Других решений пока нет …