Contexpr offsetof () и meman_offset ()C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Contexpr offsetof () и meman_offset ()

Сообщение Anonymous »

Я знаю, что этот вопрос (или связанный с ним) уже был задан в различных сообщениях на этом форуме (и я прочитал их все), но я до сих пор не получаю то, что здесь происходит с компилятором IAR 9.50.
Рассмотрим две следующие структуры: < /p>
struct ParamsStruct
{
uint8_t a;
uint16_t b;
uint32_t c;
};

struct ParamsDef
{
char acronym[5];
ValueType type;
uint32_t offset;
int min;
int max;

};
< /code>
и следующая таблица параметров: < /p>
extern const ParamsDef MY_PARAMETERS_TABLE[];
< /code>
Если я определяю свою таблицу, как это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, offsetof(ParamsStruct,a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
Все работает нормально, и таблица фактически размещена линкером во Flash, что именно то, что я ищу. Обратите внимание, что таблица не является contexpr, но линкер достаточно умный в этой ситуации, чтобы в любом случае поместить ее во Flash. Это означает, что OffSetF () может быть разрешено во время компиляции. Теперь, в тот момент, когда я делаю это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, member_offset(&ParamsStruct::a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
с meman_offset определяется как таковой: < /p>
template
size_t member_offset(U T::* member)
{
return reinterpret_cast(
&(reinterpret_cast(NULL)->*member)
);
};
< /code>
или как таковое: < /p>
template
inline size_t constexpr member_offset(T1 T2::* member) {
constexpr T2 object{};
return size_t(&(object.*member)) - size_t(&object);
}
< /code>
Таблица фактически помещается в оперативную память, то есть она будет построена во время выполнения.
Что я не получаю, так это то, как макроффильмы Offsetof () можно считать contexpr, когда он нарушает ограничение inertrepret_cast выражения ContexPR, поскольку он определяется как таковой: < /p>
#define offsetof(s,m) ((::size_t)&reinterpret_cast((((s*)0)->m)))
< /code>
Я не получаю то, что делает OffsetOf () разрешенным во время компиляции, а не meman_offset ()? К сожалению, также кажется, что просто нет способа сделать meman_offset () contexpr…
Любое просвещение более чем приветствуется!

Подробнее здесь: https://stackoverflow.com/questions/796 ... ber-offset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»