我正在编写用户API,以这种方式返回const char *值是对的吗?
const char * returnErrorString(int errorCode)
{
switch(errorCode)
...
return "This error code means that...";
}
我不喜欢以这种方式返回字符串文字但是在由于RVO优化而被用户读取之前不应该销毁它们,这是正确的吗?有什么建议吗?
答案 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} }}