c++ - 转换 Const 指针以使用遗留 C 代码

标签 c++ casting constants 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,我都会有点怀疑.

在此先感谢您的帮助。

最佳答案

是的,您对 const_cast 的使用没问题。

关于c++ - 转换 Const 指针以使用遗留 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19122465/

相关文章:

c++ - 如何获取文本宽度(DirectX、C++)

c++ - 使用 gcc 使用常量及其关联的修饰符

Go 的 const 命名约定

c++ - 基于范围的 std::move 意外调用复制构造函数

c++ - 调用 boolean 函数但出现错误 "no matching function to call"?

python - distutils.core 与带有 C++ 扩展的 setuptools

java - 无法使用泛型转换为非特定的嵌套类型

c - 访问其他大小的 32 位字数组

c - 浮点缓冲区转换为 unsigned char* 在套接字发送时丢失数据

iphone - 在运行时修改 objective-c 中的常量