Я определил битовое поле типов перечисления, чтобы соответствовать набору перемычек во встроенной системе.Я пытаюсь написать тестовый жгут в MSVC для кода, но сравнивать то, что должно быть равными значениями, не удается.
Определение выглядит так:
typedef enum { SERIAL_TEST_MODE, PARALLEL_TEST_MODE } TEST_MODE_e;
typedef union {
struct {
ACTUATOR_TYPE_e ActuatorType : 1; // 1
NORMAL_POSITION_e Damper1NormalPos : 1; // 2
NORMAL_POSITION_e Damper2NormalPos : 1; // 3
bool EnableDamper2 : 1; // 4
NETWORK_MODE_e NetworkMode : 1; // 5
FIRE_ZONE_TYPE_e FireZoneType : 1; // 6
bool PeriodicTestEn : 1; // 7
TEST_TIME_e TestTime : 3; // 8-10
TEST_MODE_e TestMode : 1; // 11
bool TestAHUEn : 1; // 12
bool TestDelayEn : 1; // 13
INPUT_1_MODE_e Input1Mode : 1; // 14
bool NightModeAHUEn : 1; // 15
ETR_ACT_MODE_e ETRActMode : 1; // 16
bool DSTEnable : 1; // 17
} Bits;
uint32_t Word;
} DIP_SWITCHES_t;
Позже следующее сравнение не удается:
config.jumpers.Bits.TestMode = PARALLEL_TEST_MODE;
if (config.jumpers.Bits.TestMode == PARALLEL_TEST_MODE)
...
Я проверил TestMode
bool в отладчике, и это выглядит странно.Значение TestMode
равно -1.
Это похоже на то, как если бы MSVC рассматривал значение как число дополнения до 2, но ширину 1 бит, поэтому 0b1 является десятичным -1.Перечисление устанавливает PARALLEL_TEST_MODE
в 1, поэтому два значения не совпадают.
Сравнение отлично работает на встроенной стороне с использованием LLVM или GCC.
Какое поведение является правильным?Я предполагаю, что GCC и LLVM лучше поддерживают стандарты C, чем MSVC в таких областях, как битовые поля.Что еще более важно, можно ли обойти эту разницу, не внося существенных изменений во встроенный код?