2014-02-10 51 views
5

在一个项目中,我看到下面一行,我不明白铸造两次的原因。在一条生产线上铸造两次

*((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; 
+1

down.common的类型是什么? –

+0

这是一个无效的指针 – mustafa

+0

只是可能是编码器喜欢它这样。 – Marian

回答

1

如果cp->down.commonvoid *已经铸造后者( “内部” 转换为(void *))是不必要的。

这将做的工作:

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

如果cp->down.common声明intptr_t,然后通过void *(如OP所示)确实去一个不同的情况下会是必要的,因为只有void *是保证适合intptr_t

的C-标准表示:

[使用intptr_t]表示具有任何有效 指针空隙可以转化为这种类型的属性有符号整数类型,然后转换回指针无效, ,结果将等于原来的指针

0

我不认为可以有任意点。 C中的演员对于许多程序员来说是相当混乱的,所以你不应该把演员当成是需要演员表演的指示。

有“太多”(=超过所需)括号太,它可以写为:

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

右手侧也没关系,*(指针引用)具有较低的precendence比->(通过指针选择元素)。一如既往地看到list of operator precedences