如何使用C兼容库和API管理C 原理

How to manage C++ principles with C compatible libraries and APIs

本文关键字:API 管理 原理 何使用      更新时间:2023-10-16

我是新来的C ,目前我正在从事某些项目,并且想使用C 而不是C。

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

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

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

这个问题的" C 解决方案"是什么?我想同时使用RAII和OOP原则。我能想到的唯一解决方案是创建一个可以接受内存大小作为构造函数中的参数并具有类似 char* _buf = new char[size]并在destructor中进行记忆的类别。这是解决这种情况的最佳解决方案吗?

,或者当我不知道大小时,我应该在哪里使用recv收到数据?在C中,我会使用malloc分配内存并在那里写入。但是我该如何在" C 样式"中执行此操作?创建我上面提到的类并使用它代替malloc

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

除此之外,是的,在使用C API时,您可能必须从C 最佳实践中做出一些权衡。这对于回调尤其明显,您无法通过捕获lambdas或指示可以通过一定数量的丑陋机械进行捕获。

某些C库由C 包装器补充,由原始库的作者或第三方(例如MySQL ,Curlpp(撰写。这意味着丑陋的机器已经为您完成了,您不必担心。

您的_buf解决方案并不可怕,但是std::vector<char>可能会更好或std::unique_ptr<char[]>(尽管再次,请考虑std::string很可能适合您的需求(。

对于recv,这是另一回事,而不是真正与C 设计原理有关的问题。您已经需要考虑您不知道有多少个字节是可读的,因此您已经需要反复读取到一个小缓冲区中并处理数据。因此,您可以继续使用良好的自动存储char buf[1024]进行此&mdash;那里从来都不需要malloc,现在仍然没有一个。