我有一个程序,它声明一个字符串数组,如下所示:
char *colors[4] = {"red", "orange", "yellow", "blue"};
但是我得到了上面的编译器警告。它可以编译,但我更喜欢使用非弃用的方式(如果有)。我试着找出它是什么意思,但我似乎不能理解它。在'char‘起作用之前,我听说过'const’的用法,但如果有人能解释一下这个错误是什么意思,那会很有帮助。谢谢。
发布于 2012-03-10 20:53:26
您输入的字符串:"red“、"organge”等是“文字”,因为它们是在程序代码本身中定义的(它们不是直接从磁盘、用户输入/stdin等读取的)。
这意味着,如果您在任何时候尝试写入colors
,您将直接访问原始输入,从而对其进行编辑。这将导致一些不需要的运行时错误。
将其声明为const将确保您永远不会尝试写入此指针,并且可以避免此类运行时错误。
const char *colors[4] = {"red", "orange", "yellow", "blue"};
如果你想在运行时编辑这些值,那么你应该先复制字符串。
发布于 2012-03-10 20:50:55
"red", "orange", "yellow", "blue"
这些是常量字符串。创建指向常量字符串的非常数指针是错误的,因此出现警告。现在你会收到一个警告,但这应该是一个错误,因为它在c++03中已被弃用,并在c++11中被禁止。
发布于 2014-07-08 12:25:46
这些答案都是正确的。
请注意,如果您有一个需要以字符数组作为参数的函数,并且您按如下方式传递此参数:
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++不可变字符串及其特性集。
如果Unicode是必需的,那么正如here所解释的那样,C++中的支持是“可怕的”。This question提供了一些线索(主要是:使用ICU库)。如果你的项目中已经有了Qt,QString
和Gettext也可以做到这一点。
https://stackoverflow.com/questions/9650058
复制相似问题