从API返回字符串文字

时间:2013-10-03 07:36:40

标签: c++ string api

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

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

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

3 个答案:

答案 0 :(得分:6)

没关系。

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

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

答案 1 :(得分:3)

字符串文字是const;他们被放在read-only data segment中(海湾合作委员会把它放在.rodata部分);一些implementations store them in the text/code segment,也是只读的。这是以这种方式修改字符串文字是非法的原因之一。

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

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

答案 2 :(得分: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而不是类似C {{1} }}