将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
What is the best way to pass uint8_t* buffer and size_t bufferlen to API function in C from a C++
C函数API接受uint8_t*和size_t作为参数:
bool foo(uint8_t* buff, size_t bufflen)
在调用这个API的C++层中,管理和处理的最佳方式是什么。字符串、矢量或列表是更好的选项吗
只需确保从C++调用此API时始终传递uint8_t
类型的指针。普通数组CCD_ 2(x是任意+ve数(也将工作。只需确保您传递的地址具有uint8_t类型的数据和正确的缓冲区大小。
例如uint8_t arr[6];
,则呼叫将是foo(arr,6);
在传递data()
和size()
时可能需要std::vector<uint8_t>
。
不能将容器传递给C函数。您仍然可以在C++代码中使用一个,但您需要根据C函数参数传递一个指向数据的指针。使用矢量。这相当于C中的数组,因为数据连续存储在内存中。
std::vector<uint8_t> myData;
// ... fill myData
// for c++11 and later,
foo(myData.data(), myData.size());
// pre-c++11
foo(&(myData[0]), myData.size());
字符串、矢量或列表是更好的选择吗?
好吧,list
是一个非启动器,因为它不会将序列存储在连续内存中。换句话说,C代码将无法获取指向第一个元素的指针,并将其递增到第二个元素。
至于其他两个,这取决于C++代码的其余部分。我倾向于vector
而不是string
,但你并没有真正提供足够的上下文来让它成为一种普遍的感觉。
通常我会使用一个助手类,该类具有一个方法,该方法要么采用向量,要么采用类似span的自定义结构,即pair<void*,int>
,甚至可能是span(但我不允许使用C++14蜡笔(。
如果数据真的是基于字符的,std::string和string跨度可以很好地工作,但如果它真的是二进制数据,向量和向量跨度是更好的封装,IMBO。
如果实际存在的是结构化数据,我仍然不想直接从应用程序代码中调用它。您可以轻松地编写一个方法,该方法采用预期的结构类型并生成指针和sizeof(实例(。
您可以编写一个可以接受任何结构的通用模板,并将其转换为void*/char*和length,但这往往会导致代码出现更多意外。
- 如何使用 AWS Transcribe C++ API 中的'StartTranscriptionJobRequest'?
- 第三方 API 中的编译错误 - Visual Studio
- numpy C API 中的import_array如何工作?
- 使用宏替换工厂模式样式 API 中的"create()"函数
- 更改 ICDBurn 窗口 API 中的默认刻录驱动器
- mmdevice API中的cocreateinstance返回错误代码0x800401f0
- 删除并清除组合框 Win32 API 中的所有项目
- 我应该如何替换 <uint8_t>API 中的 vector::const_iterator?
- 连接到MySQL时如何修复xdev C++ api中的'string too long'错误
- CNTK C API中的函数:: foruct :: forther :: trainminibatch之间的差异
- tensorflow C API中的客户端和会话之间的差异
- tensorflow C API中的float数据类型
- 使用 LDAP - 本机 API 中的页面控件获取活动目录组中的所有用户 ID
- 如何在winevt.h Windows C++API中的EvtSubscribe中使用Context参数
- C++ API 中的张量流加载模型并得到"from device: CUDA_ERROR_OUT_OF_MEMORY"错误
- 在Embarcadero Tools API中的光标位置插入文本
- 如何使用C Win32 API中的消息框文本中的值
- 非成员功能指针作为API中的回调对成员函数
- Maya API中的计算WorldMatrix
- Z3 中的常量 – C++ API 中的分段错误