gpt4 book ai didi

c - 如何处理子函数中的 const 传播

转载 作者:太空宇宙 更新时间:2023-11-04 00:20:20 30 4
gpt4 key购买 nike

我需要对现有函数进行修改,具有一些 const 输入参数:

int f(const owntype *r1, const owntype *r2)

为了做到这一点,我想调用一个使用相同类型但没有 const 关键字的子函数:

void subfunction (owntype *src, owntype *dst)

我已经尝试过这个(以及其他一些变体),但它不起作用:

int f(const owntype *r1, const owntype *r2) {
...
subfunction((const owntyp*) r1);
...
}

如何在不需要更改两个函数的参数描述的情况下编译它?

最佳答案

最好的解决方案是修改 subfunction 以获取指向 const 的指针。

在实践中,有时这是不可能的(例如,需要修改由于组织惯例而不允许修改的代码)。在这些情况下你可以这样写:

subfunction( (owntype *)r1, (owntype *)r2 );

只要您确定 subfunction 不会修改指向的对象,这就是正确的。如果它确实尝试修改它们,那么在尝试修改时会导致未定义的行为。

如果您不确定 subfunction 的作用,并且您希望进行防御性编程,那么另一种选择是获取对象的副本:

owntype c1 = *r1, c2 = *r2;
subfunction( &c1, &c2 );

请注意,检查复制不会破坏 owntype 的类不变量。


其他一些答案/评论表明,丢弃 const 可能是未定义的行为。然而事实并非如此。相关引用是C11 6.7.3/6:

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.

Link to question on that topic

关于c - 如何处理子函数中的 const 传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635592/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com