这是双重铸造有效/正确的代码吗?

时间:2011-12-22 12:50:28

标签: c

int compare_acd(const void *a, const void * b) 
{
     return ( (int)(*((ADC_VALUE_TYPE*)a)) - (int)(*((ADC_VALUE_TYPE*)b)) );
}

在我的情况下ADC_VALUE_TYPEuint16_t,但这不是规则。

1 个答案:

答案 0 :(得分:5)

不需要外部括号,return不是函数。

除此之外,我看不出有什么问题......你在取消引用之前投射指针,读取正确的位数,然后“向上转换”到int

更新:根据您的评论,您似乎想要一个否定回报,例如a指向的值小于b指向的值,因此您需要转换为签名类型。我想这很好,不是100%确定是否需要,但至少它很清楚发生了什么。

当然,为了更加清晰,它可以分解为多个语句:

int compare_acd(const void *a, const void * b) 
{
     const ADC_VALUE_TYPE va = *(ADC_VALUE_TYPE) a;
     const ADC_VALUE_TYPE vb = *(ADC_VALUE_TYPE) b;

     /* Cast to int to get signed response if a < b. */
     return (int) va - (int) vb;
}

这可能就是我写它的方式。