从字符串文字到'char*'的弃用转换

Mat*_*att 55 c++ string char literals deprecated

我有一个程序声明一个像这样的字符串数组:

char *colors[4] = {"red", "orange", "yellow", "blue"};
Run Code Online (Sandbox Code Playgroud)

但是我得到了上面的编译器警告.它编译但我宁愿使用非弃用的方式(如果有的话).我试图找出它意味着什么,但我似乎无法弄明白.我听说'char'工作之前使用'const',但如果有人能解释错误的含义,那将会有所帮助.谢谢.

d_i*_*ble 75

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

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

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

const char *colors[4] = {"red", "orange", "yellow", "blue"};
Run Code Online (Sandbox Code Playgroud)

如果您想在运行时编辑这些值,则应首先复制字符串.

  • 所需的类型签名将是`char const*colors [4]`,我相信(即四个const指针的数组). (5认同)
  • “指向数据的常量指针”与指向常量数据的指针不同。一个是指针,它可能不会改变,但它的目标(数据)可能会改变。另一个是可能会改变的指针,但它的目标数据是const,不能改变。[codeguru] (http://www.codeguru.com/cpp/cpp/cpp_mfc/general/article.php/c6967/Constant-Pointers-and-Pointers-to-Constants.htm) 的讨论。(是的,我知道我迟到了几年,但这是一个常见的混淆点)。 (3认同)
  • @HolyBlackCat:难道不是一回事吗? (2认同)

BЈо*_*вић 10

"red", "orange", "yellow", "blue"
Run Code Online (Sandbox Code Playgroud)

这些是常量字符串.创建一个指向常量字符串的非const指针是错误的,因此警告.目前你收到警告,但它应该是一个错误,因为它在c ++ 03中被弃用,而在c ++ 11中被禁止.


tik*_*tak 5

这些答案都是正确的。

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

foo ("bar");
Run Code Online (Sandbox Code Playgroud)

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

1)像这样改变它,如第一个答案中所述:

void foo (char[] str) { printf(str); }

const char param[] = "bar";
foo (param);
Run Code Online (Sandbox Code Playgroud)

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

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

foo ("bar");
Run Code Online (Sandbox Code Playgroud)

恕我直言,只要不涉及真正的性能问题并且您不使用 C 库,或者如果您正在构建供其他人使用的 C++ 库,您应该使用 C++ 不可变字符串及其功能集。

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