我正在编写用户 API,以这种方式返回 const char* 值是否正确?
const char * returnErrorString(int errorCode)
{
switch(errorCode)
...
return "This error code means that...";
}
我不喜欢以这种方式返回字符串文字,但由于 RVO 优化,它们不应该在被用户读取之前被销毁,这是正确的吗?对此有什么建议吗?
没关系。
字符串文字在程序的生命周期中具有固定的地址。您可以将其地址作为指向任何地方的指针传递。程序运行时,字符串文字不会破坏。
尽量不要修改它们会调用未定义的行为。根据第 2.14.5 节:“尝试修改字符串文字的效果未定义。”
字符串文字是const
; 它们被放在只读数据段中(GCC 把它放在 .rodata 段中);一些实现将它们存储在文本/代码段中,这也是只读的。这是以这种方式修改字符串文字是非法的原因之一。
char *literal = "You can't edit me!"; // compiler will flag it as a warning for missing const
literal[0] = 'U';
不要担心它的破坏;只要使用您的库/API 的进程/应用程序处于活动状态,它就会一直存在。
由于您使用C++标记(而不是 C 标记)标记了此问题,因此我建议您仅将std::string
其用作返回值:
std::string returnErrorString(int errorCode)
{
switch(errorCode)
...
return "This error code means that...";
}
(除非这是一个由某些 DLL 导出的纯 C 接口函数,您希望它可以从不同版本的 VC++ 编译器中使用。在这种情况下,您不能在边界处使用 STL 类。但在这种情况下,您必须明确说明在文档中,const char *
调用者代码不得删除返回的字符串。)
在现代 C++ 中,除非在某些紧密循环中对高性能有强烈std::string
要求,否则只需使用健壮方便的字符串类 like而不是 C-like const char*
。