让我们具有以下功能:
int encode(uint8b *dest, MyType srcType, const void *src)
{
uint32b value = 0;
uint64b value64 = 0;
switch (srcType)
{
case MyType_Usint: value = (uint32b)*(uint8b*)src; break;
case MyType_Uint: value = (uint32b)*(uint16b*)src; break;
case MyType_Udint: value = *(uint32b*)src; break;
case MyType_Ulint: value64 = *(uint64b*)src; break;
}
// now encode value to dest
}
我将错误对齐的
uint8b Data[sizeof(uint64b)]
传递为src
,我将修复对齐问题。但是当将函数调用为适当的类型即
Data
时,我收到了强制转换encode(dest, MyType_Uint, (uint16b*)Data)
的要求,我认为这会导致更多烦人的不必要的开关。即使在我可以访问的平台上对齐错误,它也可以正常工作,但是我不确定它如何影响其他平台。
这样的 Actor 表会修正对齐方式和/或偏爱度吗?
是的,我真的需要
void*
参数。 最佳答案
这样的转换不能固定对齐方式和尾数。
在没有未定义行为的情况下调用该函数的方法如下:
uint16b u = some_value;
encode(dest, MyType_Uint, &u);
uint64b ul = some_other_value;
encode(dest, MyType_Ulint, &ul);
这种强制转换会更改表达式的类型。在这种情况下,C风格的显式转换会重新解释强制转换。
转换后的指针只能以有限的方式使用。您可以将其转换回原始类型(您的情况下为
uint8b*
)。在大多数情况下,通过指针进行的间接访问是UB,只有少数异常(exception),其中包括指针可相互转换的对象,以及作为转换结果使用指向窄字符类型的指针。没有异常(exception)适用于您的示例,因此它将具有UB。请注意,对于某些指针,C风格的显式转换执行静态转换,而不是重新解释转换。例如,当指针指向相同继承层次结构中的类时。这就是避免使用C样式强制转换的原因:使用您打算使用的强制转换。
关于c++ - 在将指针作为void *参数的参数传递时强制转换指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56460046/