Здравствуйте, Zberik, Вы писали:
[]
Z>Хотелось бы получить что-то типа
Z>int offset = offsetofBit(S1, bf4) // == 204
Z>offset = offsetofBit(S1, bf1) // == 200
Z>Как это реализовать наиболее эффективно?
Если без ручного задания смещений, то переносимо -- никак (стандарт не особо щедр в плане битовых полей). Я и компиляторозависимых способов не знаю.
А так, можно что-то вроде следующего:
typedef struct
{
int field1 : 2;
int field2 : 1;
} MY_STRUCT;
/* надо вбивать руками */
#define BIT_OFFSET__MY_STRUCT__field1 0
#define BIT_OFFSET__MY_STRUCT__field2 2
#define OFFSETOF_BIT(struct_name, field_name) OFFSETOF_BIT_1(BIT_OFFSET__##struct_name##__##field_name)
#define OFFSETOF_BIT_1(macro) OFFSETOF_BIT_2(macro)
#define OFFSETOF_BIT_2(macro) macro
Только имейте в виду, что расположение битовых полей стандартом не специфицировано.