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