【发布时间】:2021-10-25 08:19:57
【问题描述】:
在我的 C++ 应用程序中,我使用了一个公开 C API 的外部库。一些 C 函数将字符串数组作为输入,并为此使用 char**:
void c_api_function(char** symbols, int count);
(注意:我认为指向 const 的指针会更合适,但似乎 const 的正确性对库作者来说并不重要。)
字符串必须使用特定的编码。
目前,为了调用 API,我首先将字符串转换为正确的编码并将结果存储在 vector<string> 中。然后我创建一个vector<char*> 可以传递给C API:
std::string encode(std::string const& symbol);
void call_api(std::vector<std::string> const& symbols)
{
std::vector<std::string> encoded_symbols;
for (auto const& s : symbols)
{
encoded_symbols.push_back(encode(s));
}
std::vector<char*> encoded_symbol_ptrs;
for (auto const& s : encoded_symbols)
{
encoded_symbols_ptrs.push_back(s.data());
}
c_api_function(encoded_symbols_ptrs.data(), (int)encoded_symbols_ptrs.size());
}
我不喜欢这种方法,因为我需要两个向量。第一个向量确保字符串保持活动状态,第二个向量可以传递给 API。有没有只使用单个容器,但仍然使用自动内存管理的方法?如有必要,我可以随意更改encode函数的签名,例如使用std::unique_ptr作为返回值。
【问题讨论】:
-
您不能将 C++ std::vector 作为 char** 参数传递给 C API。
-
我认为这是可以做到的。 (编码为
unique_ptr而不是string将无济于事 - 您仍然需要一个单独的指针容器。) -
通常当我在 C 程序中看到
void c_api_function(char**);时,我希望该函数通过引用返回一个 C 字符串。 -
c_api_function如何知道数组有多少元素? -
您正在将 'encoded_symbols' 传递给 'c_api_function' - 它不会编译错误的类型,您想改为传递 'encoded_symbol_ptrs'。还有一件事——如果你知道数组的最终大小,在循环中调用 push_back() 是一种不好的做法,因为它以不必要的重定位结束