c++ 如何将const char* 替换为std::string?

vxf3dgd4  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(204)

起初我有这个编译好:

static LISP err(const char* message, LISP x, const char* s)
{
    nointerrupt = 1;
    if NNULLP(x)
    {
        fprintf(stderr, "SIOD ERROR: %s %s: ",
            (message) ? message : "?",
            (s) ? s : ""
        );
        lprin1f(x, stderr);
        fprintf(stderr, "\n");
        fflush(stderr);
    }
    else
    {
        fprintf(stderr, "SIOD ERROR: %s %s\n",
            (message) ? message : "?",
            (s) ? s : ""
        );
        fflush(stderr);
    }

    if (show_backtrace == 1)
        display_backtrace(NIL);

    if (errjmp_ok == 1) { setvar(sym_errobj, x, NIL); longjmp(*est_errjmp, 1); }
    close_open_files();  /* can give clue to where error is */
    fprintf(stderr, "%s: fatal error exiting.\n", siod_prog_name);
    if (fatal_exit_hook)
        (*fatal_exit_hook)();
    else
        exit(1);
    return(NIL);
}

LISP err(const char* message, LISP x)
{
    return err(message, x, NULL);
}

LISP err(const char* message, const char* x)
{
    return err(message, NULL, x);
}

然后我想concat另一个字符串到它,我试着这样做:

LISP err(const char* message, const char* x)
{
    std::string full_message = "fromchar_" + std::string(message);
    return err(full_message.c_str(), NULL, x);
}
LISP err(const char* message, LISP x)
{
    const char* func_name = "fromlisp_";
    const char* final_message = (message) ? (func_name + std::string(message)) : "?";
    return err(final_message.c_str(), x, NULL);
}

这没有编译,说明finalmessage不是const char* 类。
有人建议将所有的“const char*”替换为“std::string”。
我试过这样做,我的函数看起来像这样:

static LISP err(const std::string& message, LISP x, const std::string& s)
{
    nointerrupt = 1;
    if (NNULLP(x))
    {
        fprintf(stderr, "SIOD nullpointer error. Wir wissen aber den typ nicht: %s %s: ", message.c_str(), s.c_str());
        lprin1f(x, stderr);
        fprintf(stderr, "\n");
        fflush(stderr);
    }
    else
    {
        fprintf(stderr, "SIOD anderer error: %s %s\n", message.c_str(), s.c_str());
        fflush(stderr);
    }

    if (show_backtrace == 1)
        display_backtrace(NIL);

    if (errjmp_ok == 1) { setvar(sym_errobj, x, NIL); longjmp(*est_errjmp, 1); }
    close_open_files();  /* can give clue to where error is */
    fprintf(stderr, "%s: fatal error exiting.\n", siod_prog_name);
    if (fatal_exit_hook)
        (*fatal_exit_hook)();
    else
        exit(1);
    return(NIL);
}
LISP err(const std::string& message, LISP x)
{
    return err("error type A:" + message, x, std::string());
}

LISP err(const std::string& message, const std::string& x)
{
    return err("error type B:" + message, LISP(), x);
}
LISP err(const std::string& message, LISP x, const std::string& x_str)
{
    const std::string func_name = "error from lisp_";
    const std::string final_message = (message.empty()) ? "?" : func_name + message;
    return err(final_message, x, x_str);
}

然而,它不会编译,说

slib.cc:733:6: error: redefinition of ‘obj* err(const string&, LISP, const string&)’
  733 | LISP err(const std::string& message, LISP x, const std::string& x_str)
      |      ^~~
slib.cc:696:13: note: ‘obj* err(const string&, LISP, const string&)’ previously defined here
  696 | static LISP err(const std::string& message, LISP x, const std::string& s)
      |             ^~
~

我该怎么解决这个问题?

5f0d552i

5f0d552i1#

在开始修改函数签名之前,您遇到的第一个问题是:
然后我想concat另一个字符串到它,我试着这样做:

LISP err(const char* message, const char* x)
{
    std::string full_message = "fromchar_" + std::string(message);
    return err(full_message.c_str(), NULL, x);
}
LISP err(const char* message, LISP x)
{
    const char* func_name = "fromlisp_";
    const char* final_message = (message) ? (func_name + std::string(message)) : "?";
    return err(final_message.c_str(), x, NULL);
}

这没有编译,说明finalmessage不是const char* 类。
这里的主要问题是你的条件运算符没有返回相同的类型:

// Error:
(message) ? (func_name + std::string(message)) : "?";

在上面的例子中,func_name + std::string(message)的类型是std::string,而"?"是一个字符串文字(类型是const char[2])。修复方法是让条件运算符的两个部分都返回一个std::string

std::string final_message = message ? ("fromlisp_" + std::string(message)) : std::string("?");

因此,下面是为使用原始静态err函数而修正的函数:

LISP err(const char* message, const char* s)
{
    std::string full_message = "fromchar_" + std::string(message);
    return err(full_message.c_str(), NULL, s);
}

LISP err(const char* message, LISP x)
{
    std::string final_message = message ? ("fromlisp_" + std::string(message)) : std::string("?");
    return err(final_message.c_str(), x, NULL);
}

相关问题