如何使用C兼容库和API管理C 原理
How to manage C++ principles with C compatible libraries and APIs
我是新来的C ,目前我正在从事某些项目,并且想使用C 而不是C。
我遇到的第一个问题是,例如在OpenSSL中,有函数接受char*
作为参数。
在C 中,使用char*
不是一个好主意。我读到有人推荐std::string
或std::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
,现在仍然没有一个。
- 用于访问容器<T>数据成员的正确 API
- 当vector是tje全局变量时,c++中vector的内存管理
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- 如何使用 AWS Transcribe C++ API 中的'StartTranscriptionJobRequest'?
- 将std::string传递给WriteConsole API
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在gtest.中使用fff.h模拟系统API
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- c ++ 是否有任何用于列出 Windows 驱动程序管理器控制台中显示的设备驱动程序的 Windows API?
- MT4交易平台API管理器 - 获取每组证券
- 如何使用C兼容库和API管理C 原理
- 多渲染API引擎着色器文件管理
- SetupDi API:以编程方式控制设备管理器功能
- c++ API: license管理,保护软件
- 如何在VB.net中使用Windows电源管理API
- 访问CPU/RAM使用情况(类似于任务管理器,但通过API!)
- Plesk 管理面板 C/C++ API 示例