- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在一个项目中我看到了下面这行,我不明白为什么要投两次。
*((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;
最佳答案
如果 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] designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer
关于一行投两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677656/
我想设置一个 float值到 1.0如果一个向量等于另一个向量,并且 0.0如果向量不相等 if( v1 == v2 ) floatVal = 1.0 ; else floatVal = 0.0
有没有什么办法投listView.SelectedIndices至 List ? 我试过了 (List)reListViewAllMovies.SelectedIndices.Cast>() 但它不起
假设我有一个数据框: data <- data.frame(id=c(1,2,2,2), code=c("A","B","A","B"),
我是一名优秀的程序员,十分优秀!