2013-10-08 2 views
1

Предположим, у меня есть следующую структуру:Shoud be casting используется для установки битполя?

struct my_struct { 
    uint32_t bf1 : 3; 
    uint32_t bf2 : 5; 
    uint32_t bf3 : 16; 
    uint32_t bf4 : 8; 
}; 

и следующее перечисление:

enum bf1_values { 
    Val1 = 0x0; 
    Val2 = 0x4; 
    Val3 = 0x7; 
}; 

Кроме того, методы получения и установки функций для BF1:

uint32_t bf1_getter() { 
    return global_struct.bf1; // cast value to (uint32_t)? 
} 


void bf1_setter(enum bf1_values val) { 
    global_struct.bf1 = val; // cast enum to (uint32_t)? 
} 

Должен ли я использовать типизация функций геттера и сеттера для обеспечения безопасности?

EDIT:

Структура должна быть отправлена ​​в HW.

EDIT2:

То, что я хочу добиться того, чтобы быть действительно уверены, что enum будет правильно записан в битовое поле, и правильно читать битовое поле.

+6

Тип-литье не имеет ничего общего с безопасностью, часто это совершенно наоборот. –

+0

@JoachimPileborg нормально, но какова нормальная/хорошая практика написания кода? – Alex

+0

Скомпилирует ли это без предупреждений? Тогда вам не нужно кастинг. В противном случае * вы должны убедиться, что код безопасен, кастинг не поможет вам (это только поможет вам закрыть предупреждения компилятора). –

ответ

2

Нет необходимости в кастинге здесь - задания уже «безопасны», поскольку соответствующая реализация не должна искажать других членов. Предполагая, что применяется семантика нормального целочисленного переполнения, единственным проблемным случаем является переполнение подписей, которое может поднять сигнал (но мне трудно понять, что это происходит на практике, если ширина битового поля меньше, чем полное слово в качестве поддержки harware для обнаружение переполнения будет отсутствовать) и в противном случае определяется реализацией. Это оговорка не относится к вашему примеру, поскольку целевые типы не имеют знака.

Следует помнить, что семантика битового поля в значительной степени определяется реализацией - даже с использованием другого типа, кроме int, на самом деле является языковым расширением - и вам решать проверить, что компилятор делает то, что вы ожидаете от него во всех соответствующих платформ.

Более портативный, но также менее удобный подход состоит в том, чтобы просто использовать uint32_t и выполнять бит, играя вручную. ЕСЛИ вам не нужна эта возможность, она должна быть прекрасной, как есть.

Смежные вопросы