我有一些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];
答案 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});
}
以上假设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