已弃用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也是如此。