5

我正在编写用户 API,以这种方式返回 const char* 值是否正确?

const char * returnErrorString(int errorCode)
{
   switch(errorCode)
    ...
   return "This error code means that...";
}

我不喜欢以这种方式返回字符串文字,但由于 RVO 优化,它们不应该在被用户读取之前被销毁,这是正确的吗?对此有什么建议吗?

4

3 回答 3

6

没关系。

字符串文字在程序的生命周期中具有固定的地址。您可以将其地址作为指向任何地方的指针传递。程序运行时,字符串文字不会破坏。

尽量不要修改它们会调用未定义的行为。根据第 2.14.5 节:“尝试修改字符串文字的效果未定义。”

于 2013-10-03T07:38:11.217 回答
3

字符串文字是const; 它们被放在只读数据段中(GCC 把它放在 .rodata 段中);一些实现将它们存储在文本/代码段中,这也是只读的。这是以这种方式修改字符串文字是非法的原因之一。

 char *literal = "You can't edit me!";   // compiler will flag it as a warning for missing const
 literal[0] = 'U';

不要担心它的破坏;只要使用您的库/API 的进程/应用程序处于活动状态,它就会一直存在。

于 2013-10-03T07:38:37.427 回答
1

由于您使用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*

于 2013-10-03T09:00:25.843 回答