首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不推荐使用从字符串文字到'char*‘的转换

不推荐使用从字符串文字到'char*‘的转换
EN

Stack Overflow用户
提问于 2012-03-11 04:48:04
回答 3查看 50.6K关注 0票数 58

我有一个程序,它声明一个字符串数组,如下所示:

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

但是我得到了上面的编译器警告。它可以编译,但我更喜欢使用非弃用的方式(如果有)。我试着找出它是什么意思,但我似乎不能理解它。在'char‘起作用之前,我听说过'const’的用法,但如果有人能解释一下这个错误是什么意思,那会很有帮助。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-11 04:53:26

您输入的字符串:"red“、"organge”等是“文字”,因为它们是在程序代码本身中定义的(它们不是直接从磁盘、用户输入/stdin等读取的)。

这意味着,如果您在任何时候尝试写入colors,您将直接访问原始输入,从而对其进行编辑。这将导致一些不需要的运行时错误。

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

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

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

票数 78
EN

Stack Overflow用户

发布于 2012-03-11 04:50:55

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

这些是常量字符串。创建指向常量字符串的非常数指针是错误的,因此出现警告。现在你会收到一个警告,但这应该是一个错误,因为它在c++03中已被弃用,并在c++11中被禁止。

票数 10
EN

Stack Overflow用户

发布于 2014-07-08 20: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也可以做到这一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9650058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档