微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

构建一个依赖于非const正确库的const-correct(C)库

我正在用C建立一个图书馆(主要是为了好玩)我已经工作了一段时间了(几年,哈哈,这只是一个爱好)

我最近将一些基础(读取,库依赖)切换到另一个库.不幸的是,所述库并不关心’const-correctness’.我有点强迫症,我喜欢挑战自己做“正确的方式”,所以我想让我的库保持正确.我已经开始这几次,有些部分是;我知道最好从一开始就开始使用const-correct,但这并不是真的相关或争论不休.事实是,我有兴趣再次认真考虑,但另一个图书馆阻止我这样做.

怎么样,你可能会问?

好吧,如果我正在调用一个显然应该是const的方法(实际上没有改变任何东西),并且我的方法也是consting(新词)的候选者,我无法确保我的方法的常量,直到其他方法也是常量.

例:

// Bad third-party library

struct Foo
{
    void should_be_const() {}
};

// My library

struct Bar
{
    Foo my_foo;
    void should_be_const() const
    {
        my_foo.should_be_const(); // ERROR!  Not a const function!
    }
};

这只有我从经验证据和我对有关常数的研究和理解中才能看出来.然而,这可能是一种错误形成的理解,所以我是开放的(并且有希望?)它是错误的并且以其他方式显示(尽管这会动摇我对常数的理解的基础哈哈)

如果他(或她)想要写一个合适的图书馆,但依赖性不是这样编写的话,那么做一个可怜的灵魂是什么?

我希望这是一个适合SO的问题.请(我相信你会)让我知道它是不是或者是否有更好的StackExchange网站发布.

附:我找到了this SO question,但我希望能够详细阐述主题/解决方案.

解决方法

你引用的另一个问题在问题上给出了很好的引导,但我会对答案有点不同意.子库中的接口将分为四种情况.

>那些不是常数而且无法期望的东西.
>事情正确地宣布为const
>逻辑上应该是const的东西,和

3A.是这样实现但未声明

3B.没有这样实现

案例1很简单 – 如果你希望你的是const,那么你需要在调用该接口之前复制输入.演员阵容错误,最终会导致崩溃或其他错误.案例2不是问题.所以案例3就是这样.

不幸的是,现实情况是案例3a和3b应该与案例1相同,因为它们是无法区分的.实施可能会因平台或版本而改变.因此,您应该创建一个副本,然后调用该接口.注意我说“应该”.实际情况是,我们大多数人都会使用const_cast来调用我们认为理解的接口(例如strcmp).它成为一个关于我们对实施有多自信的判断.就个人而言,我不担心strcmp.几乎任何更高级别的东西都可以使用类似strtok的东西来破坏事物.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐