将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++

本文关键字:API 中的 函数 是什么 方式 最佳 C++ buffer uint8 size tbufferlen      更新时间:2023-10-16

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,但这往往会导致代码出现更多意外。