如何使用与C兼容的库和API管理C ++原则

时间:2019-05-23 14:42:50

标签: c++ c

我是C ++的新手,目前正在从事某个项目,并且希望使用C ++而不是C。

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

在C ++中,使用char*不是一个好主意。我了解到有人建议改用std::stringstd::vector<char>

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

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

或者当我不知道大小时,应该使用recv从套接字接收的数据放在哪里?在C语言中,我将使用malloc分配内存并将其写入那里。但是,我该如何以“ C ++风格”做到这一点?创建我上面提到的类并使用它代替malloc

1 个答案:

答案 0 :(得分:7)

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,而且现在还没有。