Здравствуйте, 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
Только имейте в виду, что расположение битовых полей стандартом не специфицировано.
Здравствуйте, Zberik, Вы писали:
Z>Хотелось бы получить что-то типа
Z>int offset = offsetofBit(S1, bf4) // == 204
Z>offset = offsetofBit(S1, bf1) // == 200
Z>Как это реализовать наиболее эффективно?
Я бы написал прекомпилер такого хедера. Правда пришлось бы модифицировать прекомпиллер для каждого из компиляторов.
Но если это
реально надо, то куда деваться? Правда всё будет исключительно комилятор специфик
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
2Аноним:
Ruchkami ne est good... 8-(
2Erop
E>Я бы написал прекомпилер такого хедера. Правда пришлось бы модифицировать прекомпиллер для каждого из компиляторов.
E>Но если это реально надо, то куда деваться? Правда всё будет исключительно комилятор специфик
V obshem sluchae naverno tolko tak. Vidimo etot vopros otlozhitsya na dolgii srok.
Tema zakrita. Vsem spasibo.