以下函数返回的指针是否有效?
const char * bool2str( bool flg )
{
return flg ? "Yes" : "No";
}
它在Visual C ++和g ++中运行良好。 C ++标准对此有何看法?
答案 0 :(得分:25)
关于存储时间:
<强> 2.13.4 强> 普通字符串文字和UTF-8字符串文字也称为窄字符串文字。一个箭头 string literal的类型为“const of n const char”,其中n是下面定义的字符串的大小,并且具有 静态存储时间
与3.7.1一起阅读
<强> 3.7.1。强>
所有没有动态存储持续时间的对象,没有线程存储持续时间,并且是 不是本地有静态存储持续时间。这些物体的存放时间应为 程序(3.6.2,3.6.3)。
在类型:
附件C
子条款2.13.4:
更改:字符串文字构成了const 字符串文字的类型从“char of char”更改为“const char数组”.a的类型 char16_t字符串文字从“some-integer-type”数组更改为“const char16_t数组”。 char32_t字符串文字的类型从“some-integer-type”数组更改为“const char32_-数组” t。“宽字符串文字的类型从”wchar_t数组“更改为”const wchar_t数组。“
基本原理:这可以避免调用不合适的重载函数,这可能会导致 修改其论点。
对原始功能的影响:更改定义明确的功能的语义。 转换难度:简单的句法转换,因为字符串文字可以转换为 字符*; (4.2)。最常见的情况由新的但已弃用的标准转换处理: char * p =“abc”; //在C中有效,在C ++中已弃用 char * q = expr? “abc”:“de”; //在C中有效,在C ++中无效
广泛使用:有合理理由将字符串文字视为潜在指针的程序 可修改的记忆可能很少见。
动态分配(单词'heap'从未在标准中的内存AFAIK区域的上下文中使用)内存需要一个函数调用,该函数调用可以在分配静态内存后很早就发生main
。
答案 1 :(得分:13)
此代码完全有效且符合要求。唯一的“问题”是确保调用者不会尝试释放字符串。
答案 2 :(得分:12)
此代码有效且符合标准。
字符串文字存储在只读存储器中,该函数只获取所选字符串的地址。
C ++标准(2.13.4)说:
普通的字符串文字有类型 “n const char数组”和静态 存储时间
他们关键在于理解你的问题,是静态存储持续时间:在程序启动时分配字符串文字,在程序持续时间内持续。你的函数只获取地址并返回它。
答案 3 :(得分:5)
技术上是的,它是有效的 字符串有静态存储durataion。
但这不是整个故事。
这些是C-Strings。 C-Library和函数中的约定是返回应该被释放的动态分配的字符串。即返回的指针隐式将所有权返回给调用者(因为在C中也有例外)。
如果您不遵守这些惯例,您会混淆许多有望参加此类惯例的经验丰富的C开发人员。如果您不遵循此标准期望,则应在代码中详细记录。
这也是C ++(根据你的标签)。因此返回std :: string更为常规。这样做的原因是只通过指针传递所有权(这导致C代码中的许多错误,上述期望被打破但记录在案,遗憾的是文档从未被代码用户读取)。通过使用std :: string,你传递一个对象,它们不再是所有权的问题(结果作为一个值传递回来,因此你的传递回来),但因为它是一个对象,所以没有资源分配的问题或问题
如果你担心效率,我认为这是一个虚假的问题。
如果您希望通过流进行打印,那么已经有了一个标准惯例:
std::cout << std::boolalpha << false << std::endl;
std::cout << std::boolalpha << true << std::endl;