c++ - 如何使用 C 兼容库和 API 管理 C++ 原则

标签 c++ c

我是 C++ 的新手,目前我正在做一些项目,想使用 C++ 而不是 C。

我遇到的第一个问题是,例如在 OpenSSL 中有接受 char* 的函数。作为参数。

在 C++ 中使用 char* 不是一个好主意.我读到有人推荐 std::stringstd::vector<char>相反。

但是例如BIO_read (将数据写入 char* )OpenSSL 中的函数接受 char* . std::string具有功能c_str()但它返回 const char* .我知道我可以投 const使用 const_cast但这不是一个好主意,因为这不是更改字符串的方式。

这个问题的“C++ 解决方案”是什么?我想同时使用 RAII 和 OOP 原则。我能想到的唯一解决方案是创建一个类,该类将接受内存大小作为构造函数中的参数,并具有类似 char* _buf = new char[size] 的内容。并在析构函数中释放内存。这是解决这种情况的最佳方案吗?

或者我应该把使用 recv 从套接字接收到的数据放在哪里?当我不知道尺码时?在 C 中,我会使用 malloc 分配内存并写在那里。但是我怎样才能以“C++ 风格”做到这一点呢?创建我上面提到的类并使用它代替 malloc

最佳答案

std::string还有.data()您应该将其用于此任务(至少在保证字符串数据连续的现代 C++ 中)。

除此之外,是的,在使用 C API 时,您可能必须根据 C++ 最佳实践做出一些权衡。这在回调中尤为明显,如果没有一些丑陋的机制,您就无法将捕获的 lambda 表达式或指向成员函数的指针传递给回调。

一些 C 库由 C++ 包装器补充,由原始库的作者或第三方(例如 MySQL++、curlpp)编写 — 这意味着丑陋的机器已经为您完成,您不必担心关于它。

你的 _buf解决方案并不可怕,而是一个std::vector<char>那么可能会更好或std::unique_ptr<char[]> (不过,再次考虑 std::string 可能很适合您的需求)。

对于 recv ,那是另一回事,它不是真正与 C++ 设计原则相关的问题。您已经需要考虑您不知道有多少字节是可读的,因此您已经需要重复读入一个小缓冲区并处理数据。所以你可以继续使用你漂亮的自动存储 char buf[1024]为此——从来不需要 malloc那里,现在还没有。

关于c++ - 如何使用 C 兼容库和 API 管理 C++ 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277703/

相关文章:

c - 逆时针旋转数组,一步中出现意外的调试输出

c++ - 在 Linux 上用 C++ 编写类似 pexpect 的程序

c++ - 使用成员函数指针调用正确的虚方法

c++ - 将类中私有(private)变量的值传递给函数

c - 在 for 循环中重复使用 switch 语句

计算 C 中两个 ISO 8601 日期(包括毫秒)之间的差异

C 防止堆溢出

c++ - 如何写union类型的推导指南

c# - Int 到字节数组并返回不给大数字相同的值

python - 这是(Python)脚本的安全suid/功能包装器吗?