使用 C 库时 C++ 中的 const 正确性

Posted

技术标签:

【中文标题】使用 C 库时 C++ 中的 const 正确性【英文标题】:Const correctness in C++ when using a C library 【发布时间】:2013-01-05 02:57:25 【问题描述】:

目前我正在开发一个 C++ 应用程序,我希望它是 const 正确的。意味着尽可能在参数上使用 const 之类的东西。然而,这个 C++ 应用程序使用了一个不经常使用 const 的 C 库。我遇到的问题是,当向 C 库中的函数发送参数时,参数不能是 const,所以我不得不进行强制转换。 使用 const cast 有损于我一直在努力的整个 const 正确性。当使用 const 不正确的 C 库时,您是否只是顺其自然而不使用 const 正确性以便轻松使用这些库?或者有没有更好的方法我没有看到?请注意,这是一个相当小的程序,因此隔离使用该库的部分并仅使该部分不正确不是真正的选择。

【问题讨论】:

如果您绝对确定它不会修改参数,您可以使用const_cast,但您始终可以只复制一份。 更适合程序员 IMO,因为 SO 不是针对编码风格,而是针对编码问题。 @chris 我无法对其进行安全复制。 【参考方案1】:

就个人而言,我更喜欢在不正确的库边界使用强制转换。这种方法的好处是您可以让您的代码获得正确使用 const 的好处。不利的一面是,如果库修改了一个对象,即使是“临时”,你已经抛弃了 const,你的程序可能会出错。

例如,我见过 C 库采用 char * 参数,它们不会在逻辑上修改。但是,他们的解析器可能会暂时用零替换字符串中的分隔符,以使用strcpy 来提取它们。如果您抛弃 const 以允许 C++ 函数采用 const char *,并且有人将指针传递给实际上是 const 的对象,则用零“临时”替换分隔符会导致错误。

【讨论】:

+1 我在 3rd 方库中也体验过类似的“功能”,尤其是在更“可靠”的商业加密库之一中。

以上是关于使用 C 库时 C++ 中的 const 正确性的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 const 正确性

C++ NULL 指针和 const 正确性

const 正确性如何帮助编写更好的程序?

Python 的 C API 的 const 正确性

const 在c及c++中应用

C 中的泛型编程 - void*- const 正确性