作为我上一个问题(Variable Length Array Performance Implications (C/C++))的后续内容,我在使用C系统调用writev()维护const正确性时遇到了一些麻烦。也就是说,好像我遇到了与用户在C中完全相同的问题,尽管我使用的是C ++:
以下是我的代码片段:
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,我都会得到一个有点怀疑。
提前感谢您的帮助。
答案 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的用法看起来没问题。