起初我有这个编译好:
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)
| ^~
~
我该怎么解决这个问题?
1条答案
按热度按时间5f0d552i1#
在开始修改函数签名之前,您遇到的第一个问题是:
然后我想concat另一个字符串到它,我试着这样做:
这没有编译,说明finalmessage不是const char* 类。
这里的主要问题是你的条件运算符没有返回相同的类型:
在上面的例子中,
func_name + std::string(message)
的类型是std::string
,而"?"
是一个字符串文字(类型是const char[2]
)。修复方法是让条件运算符的两个部分都返回一个std::string
:因此,下面是为使用原始静态
err
函数而修正的函数: