将const char **转换为std :: vector <std :: string> </std :: string>

时间:2014-06-11 11:22:31

标签: c# c++ interop type-conversion

我有以下包装器将我的C ++代码公开给C#

extern "C" {
   LIBRARY_API void GenerateTables(
      const char* version, 
      const char* baseDir, 
      const char** fileList);
} // end extern "C"

void GenerateTables(
   const char* version,
   const char* baseDir,
   const char** fileList)
{
   std::string strVersion(version);
   std::string strBaseDir(baseDir);

   // I now need to convert my const char** to std::vector<std::string> 
   // so it can be passed to another internal method.
}

如何将const char** fileList转换为std:vector<std::string>。我对C ++比较陌生,这里有一个明显的内存分配问题。我可以做类似

的事情
std::vector<std::string> vec;
for (int i = 0; i < fileList.length() /* length() of what!? */; i++)
    vec.push_back(/* what!? */);

如何进行必要的转换,是否有更好的方法可以通过互操作将C#中的字符串数组(string[])传递给C ++?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

您需要以非管理代码的方式获取长度。有两种常用的方法:

  1. 将数组的长度作为额外参数传递。
  2. 使用空终止数组。遇到null项时,数组结束。
  3. 任何一个选项都足够简单,您可以实现。选择完全取决于您的个人偏好。

    如果您选择第一个选项,则可以像这样填充矢量:

    std::vector<std::string> files(fileList, fileList + length);
    

    如果您选择第二个选项,那么您将使用如下循环:

    std::vector<std::string> files;
    const char** filePtr = fileList;
    while (*filePtr != nullptr)
        files.push_back(*filePtr++); 
    

答案 1 :(得分:1)

您需要知道fileList数组的长度。知道后,您可以使用

转换fileList
size_t length = ... ;
std::vector<std::string> files( fileList, fileList + length );