C ++字符串的C实现&字符串向量

时间:2017-09-04 07:38:48

标签: c++ arrays string vector

我有一些C ++ API,如下所示:

API1(std::string str, std::vector<std::string> vecofstr);

我想从C代码中调用此API。我如何为此提供C包装?

std::string str =&GT;

  

我可以将char *用于std :: string

&安培;

std::vector<std::string> vecofstr =&gt; char *的数组,用于像

这样的字符串向量
  

char * arrOfstrings [SIZE];

2 个答案:

答案 0 :(得分:19)

这是相应的C头(及其C ++实现)的样子:

声明

#ifdef __cplusplus
extern "C"
#endif
void cAPI1(const char *str, const char * const *vecofstr, size_t vecofstrSize);

实施

extern "C" void cAPI1(const char *str, const char * const *vecofstr, size_t vecofstrSize)
{
  API1(str, {vecofstr, vecofstr + vecofstrSize});
}

[Live example]

以上假设C代码将对所有字符串参数使用以零结尾的字符串。如果不是这种情况,则必须相应地修改cAPI1的参数(理想情况是基于C代码实际使用的字符串表示)。

答案 1 :(得分:-3)

1.api.h

#ifndef API_H_
#define API_H_
#include <vector>
#include <string>

void api1(std::string& str, std::vector<std::string>& vecofstr);

#endif

0.2。 api.cpp

#include "api.h"
#include <iostream>

void api1(std::string& str, std::vector<std::string>& vecofstr) {
  std::cout << str << std::endl;

  for (size_t i=0; i<vecofstr.size(); i++) {
    std::cout << vecofstr[i] << std::endl;
  }
}

3.wrapper.h

#ifndef WRAPPER_H_
#define WRAPPER_H_

#define SIZE 2

#ifdef __cplusplus
extern "C" {
#endif
  extern void wrapper1(char* p, char* [SIZE]);
#ifdef __cplusplus
};
#endif
#endif

4.wrapper.cpp

#include <string>

#include "wrapper.h"
#include "api.h"

#ifdef __cplusplus
extern "C" {
#endif

void wrapper1(char* p, char* ps[SIZE]) {
  std::string str(p);
  std::vector<std::string> vecofstr;
  for (size_t idx=0; idx<SIZE; idx++) {
    vecofstr.push_back(ps[idx]);
  }
  api1(str, vecofstr);
}

#ifdef __cplusplus
};
#endif

0.5。 test.c的

#include "wrapper.h"

int main(void)
{
  char* p = "hello world";
  char* ps[] = {"world", "hello"};
  wrapper1(p, ps);
  return 0;
}

0.6。编译

gcc -c api.cpp wrapper.cpp
gcc test.c -o test wrapper.o api.o -lstdc++

0.7。运行

./test
hello world
world
hello