Mat*_*att 55 c++ string char literals deprecated
我有一个程序声明一个像这样的字符串数组:
char *colors[4] = {"red", "orange", "yellow", "blue"};
Run Code Online (Sandbox Code Playgroud)
但是我得到了上面的编译器警告.它编译但我宁愿使用非弃用的方式(如果有的话).我试图找出它意味着什么,但我似乎无法弄明白.我听说'char'工作之前使用'const',但如果有人能解释错误的含义,那将会有所帮助.谢谢.
d_i*_*ble 75
您输入的字符串:"red","organge"等是"literal",因为它们是在程序代码本身内部定义的(它们不是直接从磁盘读取,用户输入/ stdin等).
这意味着如果您在任何时候尝试写信给您,colors
您将直接访问原始输入并进行编辑.这会导致一些不希望的运行时错误.
将它声明为const将确保您永远不会尝试写入此指针,并且可以避免此类运行时错误.
const char *colors[4] = {"red", "orange", "yellow", "blue"};
Run Code Online (Sandbox Code Playgroud)
如果您想在运行时编辑这些值,则应首先复制字符串.
BЈо*_*вић 10
"red", "orange", "yellow", "blue"
Run Code Online (Sandbox Code Playgroud)
这些是常量字符串.创建一个指向常量字符串的非const指针是错误的,因此警告.目前你收到警告,但它应该是一个错误,因为它在c ++ 03中被弃用,而在c ++ 11中被禁止.
这些答案都是正确的。
请注意,如果您有一个需要字符数组作为参数的函数,并且您像这样传递这个参数:
foo ("bar");
Run Code Online (Sandbox Code Playgroud)
将显示相同的警告。在这种情况下,您可以:
1)像这样改变它,如第一个答案中所述:
void foo (char[] str) { printf(str); }
const char param[] = "bar";
foo (param);
Run Code Online (Sandbox Code Playgroud)
2) 考虑使用 C++ 标准字符串,如下所示:
void foo (std::string theParam) { std::cout << theParam; }
foo ("bar");
Run Code Online (Sandbox Code Playgroud)
恕我直言,只要不涉及真正的性能问题并且您不使用 C 库,或者如果您正在构建供其他人使用的 C++ 库,您应该使用 C++ 不可变字符串及其功能集。
如果Unicode是必需的,在C ++的支持是“可怕”的解释在这里。
这个问题给了你一些线索(主要是:使用IBM ICU库)。如果你的项目中已经有 Qt,它QString
也可以解决这个问题,Gettext 也是如此。
归档时间: |
|
查看次数: |
43118 次 |
最近记录: |