【问题标题】:Const correctness in C++ when using a C library使用 C 库时 C++ 中的 const 正确性
【发布时间】: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 我无法对其进行安全复制。

标签: c++ constants const-correctness


【解决方案1】:

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

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

【讨论】:

  • +1 我在 3rd 方库中也体验过类似的“功能”,尤其是在更“可靠”的商业加密库之一中。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多