Хорошо, оба вопроса касаются моего вывода компиляции, так как я пытаюсь удалить все предупреждения ..
На первый вопрос :
Я xor'ing значения с плавающей точкой, вывод компилятора:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
inline float ClassXY::GetFloat(void) const
{
uint32_t xored = *(uint32_t*)&m_pParent->m_Value.m_fValue ^ (uint32_t)this; // compiler warning for this line
return *(float*)&xored;
}
m_pParent - указатель на этот класс ClassXY *m_pParent;
m_Value - это переменная структуры, а m_fValue определяется как float внутри структуры.
Есть идеи, как обойти предупреждение? (Я знаю, что могу отключить предупреждение, но понятия не имею, чтобы найти для него чистое решение)
Мое второе число будет:
Сценарий почти такой же, только с int. Компилятор говорит о потере информации: warning: cast from ‘const ClassXY*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]
Без флага компилятора -fpermissive я не смог бы скомпилировать ..
inline int ClassXY::GetInt(void) const
{
return (int)(m_pParent->m_Value.m_nValue ^ (int)this); // compiler warning for this line
}
И снова, есть идеи, как это исправить?
Или это невозможно без предупреждения, чего я пытаюсь достичь?
Чтобы дать вам представление о том, что это такое:
auto example = g_pClassXY->FindVar("example_var");
Тогда: float float_val = example->fValue; // direct access, value is wrong
Чтобы получить правильное значение, правильным подходом будет: float float_val = example->GetFloat();
Заранее спасибо!