一次铸造两次

时间:2014-02-10 12:47:04

标签: c casting

在一个项目中,我看到以下一行,我不明白两次投射的原因。

*((MY_STRUCT_T*)(void *)cp->down.common) = *(cp->dpr);

两次投射的原因是什么?为什么不直接投射到MY_STRUCT_T *?


添加更多详细信息:

typedef union download_s {
    MY_STRUCT_1_T *a1;
    MY_STRUCT_2_T *a2;
    void         *common;
} download_t;

typedef struct cp_s {
 ...
 MY_STRUCT_T *dpr;
 ...
} cp_t;

2 个答案:

答案 0 :(得分:1)

如果cp->down.common void *已经投射到后者(“内部”投射到(void *))是不必要的。

这可以胜任:

*((MY_STRUCT_T *) cp->down.common) = *(cp->dpr);

如果cp->down.common被声明为intptr_t,则会有不同的情况,那么确实需要通过void *(如OP中所示),因为只保证void *适合intptr_t

C标准说:

  

[intptr_t]指定带有任何有效属性的有符号整数类型   指向 void 的指针可以转换为此类型,然后转换回指向 void 的指针,   并且结果将与原始指针

进行比较

答案 1 :(得分:0)

我认为没有任何意义。 C语言中的强制转换对许多程序员来说相当混乱,因此你不应该将强制转换视为需要进行强制转换。

也有“太多”(=超过要求的)括号,它可以写成:

*(MY_STRUCT_T *) cp->down.common = *cp->dpr;

右侧也可以,*(指针取消引用)的优先级低于->(通过指针选择元素)。一如既往地查看list of operator precedences