请考虑以下代码.
typedef struct{
int field_1;
int field_2;
int field_3;
int field_4;
uint8_t* data;
uint32_t data_size;
} my_struct;
void ext_function(inalterable_my_struct* ims, ...);
Run Code Online (Sandbox Code Playgroud)
我想允许ext_function(由第三方书面)仅修改field_3和field_4在my_struct.所以我做了以下事情:
typedef struct{
const int field_1;
const int field_2;
int field_3;
int field_4;
const uint8_t* data;
const uint32_t data_size;
} inalterable_my_struct;
void ext_function(inalterable_my_struct* ims, ...);
Run Code Online (Sandbox Code Playgroud)
在调用之间my_struct和inalterable_my_struct之前转换指针是否安全ext_function(如下所示)?
void call_ext_function(my_struct* ms){
inalterable_my_struct* ims = (inalterable_my_struct*)ms;
ext_function(ims, ...);
}
Run Code Online (Sandbox Code Playgroud)
我不认为这是个好主意.
被调用的函数总是可以抛弃任何const:ness,并根据需要修改数据.
如果您可以控制调用点,最好创建一个副本并使用指向该副本的指针调用该函数,然后复制您关注的两个字段:
void call_ext_function(my_struct* ms)
{
my_struct tmp = *ms;
ext_function(&tmp, ...);
ms->field_3 = tmp.field_3;
ms->field_4 = tmp.field_4;
}
Run Code Online (Sandbox Code Playgroud)
更清洁,除非你每秒数千次这样做,否则性能损失应该是微不足道的.
如果函数触及它,你可能也必须伪造基于指针的数据.
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |