使用传统C代码转换Const指针

时间:2013-10-01 17:35:09

标签: c++ casting const const-cast

作为我上一个问题(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

以下是我的代码片段:

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,我都会得到一个有点怀疑。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

是的,您对const_cast的使用很好。

答案 1 :(得分:0)

如果其中一个数组元素不会被修改(永远),那么你可以将它声明为一个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的用法看起来没问题。