我正在尝试学习如何从c++
访问c
库,我了解我必须使用extern "C"
,为了对其进行测试,我从以下工作开始c
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void c_free_string(const char *str){
free(str);
}
char *concat(const char *str1, const char *str2)
{
char *res;
const char del[] = ", ";
res = malloc(strlen(str1) + strlen(str2) + strlen(del) + 1);
if (!res) {
fprintf(stderr, "malloc() failed: insufficient memory!\n");
return EXIT_FAILURE;
}
strcpy(res, str1);
strcat(res, del);
strcat(res, str2);
printf("Result: '%s'\n", res);
return res;
}
int main(void) {
const char str1[] = "First";
const char str2[] = "Second";
char* s = concat(str1, str2);
printf("Result: '%s'\n", s);
c_free_string(s);
return EXIT_SUCCESS;
}
c++
代码c++
代码生成的库进行c绑定。我从下面开始,但是卡住了:
#include <iostream>
#include <sstream>
extern "C"
void c_free_string(const char *str){
free(str);
}
extern "C"
char *concat(const char *str1, const char *str2)
{
std::cout << "Hello from C++";
stringstream ss;
ss << str1 << ", " << str2;
string res = ss.str();
std::cout << "Result: "<<res;
return res;
}
答案 0 :(得分:0)
感谢您的评论,答案似乎是:
#include <iostream>
#include <sstream>
extern "C"
void c_free_string(char *str){
free(str);
}
extern "C"
char *concat(const char *str1, const char *str2)
{
printf("welcome from c++\n");
char *res;
const char del[] = ", ";
res = (char*) malloc(strlen(str1) + strlen(str2) + strlen(del) + 1);
if (!res) {
fprintf(stderr, "malloc() failed: insufficient memory!\n");
exit(EXIT_FAILURE);
}
strcpy(res, str1);
strcat(res, del);
strcat(res, str2);
printf("Result: '%s'\n", res);
return res;
}
UODATE
基于Paul McKenzie反馈的清洁版本:
#include <iostream>
#include <string>
#include <cstring>
extern "C"
void c_free_string(char *str){
delete [] str;
}
extern "C"
char *concat(const char *str1, const char *str2)
{
const char* del = ", ";
int len1 = strlen(str1);
int len2 = strlen(del);
int len3 = strlen(str2);
char *res = new char [len1 + len2 + len3 + 1]{};
strcpy(res, str1);
strcpy(res + len1, del);
strcpy(res + len1 + len2, str2);
return res;
}
int main()
{
char *test = concat("abc", "123");
std::cout << test;
c_free_string(test);
}