我需要修改现有函数,有一些const输入参数:
int f(const owntype *r1, const owntype *r2)
Run Code Online (Sandbox Code Playgroud)
为了做到这一点,我想调用一个使用相同类型但没有const关键字的子函数:
void subfunction (owntype *src, owntype *dst)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个(以及其他一些变体),但它不起作用:
int f(const owntype *r1, const owntype *r2) {
...
subfunction((const owntyp*) r1);
...
}
Run Code Online (Sandbox Code Playgroud)
如何在不需要更改两个函数的parmeter描述的情况下编译它?
最好的解决方案是修改subfunction指针const.
在实践中,有时这是不可能的(例如,需要修改由于组织实践而不允许修改的代码).在这些情况下,你可以写:
subfunction( (owntype *)r1, (owntype *)r2 );
Run Code Online (Sandbox Code Playgroud)
只要您确定subfunction不修改指向的对象,这是正确的.如果确实尝试修改它们,那么在尝试修改时会导致未定义的行为.
如果您不确定是什么subfunction,并且您想要进行防御性编程,那么另一种选择是获取对象的副本:
owntype c1 = *r1, c2 = *r2;
subfunction( &c1, &c2 );
Run Code Online (Sandbox Code Playgroud)
注意,检查制作副本不会破坏类的不变量owntype.
其他一些答案/评论表明,抛弃const可能是未定义的行为.但事实并非如此.相关报价为C11 6.7.3/6:
如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为是未定义的.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |