让我们具有以下功能:

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/

10-11 15:09
查看更多