在一个项目中我看到了以下行,我不明白两次投射的原因.
*((MY_STRUCT_T*)(void *)cp->down.common) = *(cp->dpr);
Run Code Online (Sandbox Code Playgroud)
两次铸造的原因是什么?为什么不直接投射到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;
Run Code Online (Sandbox Code Playgroud)
如果cp->down.common已经void *强制转换为后者(“内部”强制转换为(void *))是不必要的。
这可以完成这项工作:
*((MY_STRUCT_T *) cp->down.common) = *(cp->dpr);
Run Code Online (Sandbox Code Playgroud)
一种不同的情况是,如果cp->down.common声明了intptr_t,那么确实需要通过void *(如OP所示),因为 onlyvoid *保证适合intptr_t。
C 标准说:
[intptr_t] 指定一个有符号整数类型,其属性是任何有效的void指针都可以转换为该类型,然后转换回void指针,结果将与原始指针进行比较
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |