这个C代码的C ++等价物是什么

时间:2020-04-24 00:27:05

标签: c++ c

我正在尝试学习如何从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;
}
  1. 我想写与上面等效的c++代码
  2. 我想确保使用正确的声明能够与从此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;
}

1 个答案:

答案 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);
}