已弃用string文字转换为“char *”

我有一个程序,这样的声明一个string数组:

char *colors[4] = {"red", "orange", "yellow", "blue"}; 

但是我得到了上面的编译器警告。 它编译,但我宁愿使用非弃用的方式(如果有的话)。 我试图找出它的意思,但我似乎无法弄清楚。 我曾经听说在'char'之前使用'const',但是如果有人能够解释这个错误的含义,那将会很有帮助。 谢谢。

你input的string:“red”,“organge”等是“literal”,因为它们是在程序代码本身内部定义的(它们不是直接从磁盘,用户input/标准input等中读取)。

这意味着,如果您在任何时候尝试写入您的colors您将直接访问您的原始input并进行编辑。 这会导致一些不希望的运行时错误。

将其声明为const将确保您永远不会尝试写入此指针,并避免这种运行时错误。

 const char *colors[4] = {"red", "orange", "yellow", "blue"}; 

如果你想在运行时编辑这些值,那么你应该首先复制string。

 "red", "orange", "yellow", "blue" 

这些是不变的string。 创build一个非常量指针到一个常量string是错误的,因此警告。 目前您正在收到警告,但应该是错误的,因为它在c ++ 03中被弃用,而在c ++ 11中被禁止。

这些答案都是正确的。

请注意,如果你有一个函数需要一个字符数组作为参数,并且你传递了这个参数:

 foo ("bar"); 

将显示相同的警告。 在这种情况下,您可以:

1)像这样改变它,正如第一个答案中所解释的那样:

 void foo (char[] str) { printf(str); } const char param[] = "bar"; foo (param); 

2)考虑使用C ++标准string,如下所示:

 void foo (std::string theParam) { std::cout << theParam; } foo ("bar"); 

恕我直言,只要没有真正的性能问题,你不用C库,或者如果你正在build造一个C ++库供其他人使用,你应该使用C ++不可变string和它们的function集。

如果需要Unicode,那么在C ++中的支持是“可怕的”,正如这里所解释的那样。 这个问题给你一些线索(主要是:使用IBM ICU库)。 如果你的项目中已经有了Qt,那么QString也会这样做,Gettext也是如此。