在一个项目中,我看到以下一行,我不明白两次投射的原因。
*((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;
答案 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。