【问题标题】:Casting Const Pointer To Work With Legacy C Code铸造 const 指针以使用旧版 C 代码
【发布时间】:2013-10-01 17:35:08
【问题描述】:

作为我上一个问题 (Variable Length Array Performance Implications (C/C++)) 的后续,我在使用 C 系统调用 writev() 维护 const 正确性时遇到了一些麻烦。也就是说,虽然我使用的是 C++,但我似乎遇到了与该用户在 C 中遇到的完全相同的问题:

https://codereview.stackexchange.com/questions/9547/casting-const-pointer-to-non-const-pointer-when-using-struct-iovec

这是我的代码的 sn-p:

int my_awesome_transmit_function(const uint8_t* const buffer, const size_t length) {
  // ... some stuff happens...
  struct iovec iov[2];
  iov[1].iov_base = buffer;  // compiler yells about this
  iov[1].iov_len = length;
  // ... some more code you don't care about
  writev(my_fd, iov, 2);
}

鉴于 CodeReview 帖子中提出的解决方案,我已对给我带来问题的行实施了以下更改,因为我想避免 C 样式转换:

iov[1].iov_base = const_cast<uint8_t*>(buffer);

这是使用 const cast 的有效方式吗?据我所知,writev 保证不会修改 iov 结构 (http://linux.die.net/man/2/writev)。这篇博文 (http://blog.aaronballman.com/2011/06/when-should-you-use-const_cast/) 让我相信这是一个有效的用法(因为我从不修改缓冲区),但我想确定一下,因为通常无论我在哪里看到 const_cast 或 reinterpret_cast,我都会有点怀疑.

提前感谢您的帮助。

【问题讨论】:

    标签: c++ casting constants const-cast


    【解决方案1】:

    是的,您可以使用const_cast

    【讨论】:

      【解决方案2】:

      如果数组元素之一(永远)不会被修改,那么您可以将其声明为 const。

      const struct iovec iov_c(buffer, length); // create a constructor for your struct! always neater than
                                                // assigning their members directly in code.
      

      这假设您可以控制 writev(..) 的签名并且可以传入两个 iovec 指针。

      如果没有,那里的 const_cast 用法看起来还不错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2010-12-27
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 2023-04-07
        • 2012-01-28
        相关资源
        最近更新 更多