C 已弃用从字符串常量到 'char\*' 的转换

新手上路,请多包涵

我有一堂课是 private char str[256];

为此我有一个显式的构造函数:

 explicit myClass(const char *func)
{
    strcpy(str,func);
}

我称之为:

 myClass obj("example");

当我编译它时,我收到以下警告:

不推荐将字符串常量转换为 ‘char*’

为什么会这样?

原文由 mkamthan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

这是您在遇到如下情况时看到的错误消息:

 char* pointer_to_nonconst = "string literal";

为什么?好吧,C 和 C++ 在字符串文字的类型上有所不同。在 C 中,类型是 char 数组,而在 C++ 中,类型是 char 常量 数组。在任何情况下,您都不允许更改字符串文字的字符,因此 C++ 中的 const 并不是真正的限制,而是更多的类型安全。出于安全原因,如果没有明确的演员表,从 const char*char* 的转换通常是不可能的。但是为了与 C 向后兼容,C++ 语言仍然允许将字符串文字分配给 char* 并警告您不推荐使用此转换。

因此,在您的程序中缺少一个或多个 const s 以确保 const 正确性。但是您向我们展示的代码不是问题,因为它没有进行这种已弃用的转换。警告一定来自其他地方。

原文由 sellibitze 发布,翻译遵循 CC BY-SA 4.0 许可协议

这个问题的一个原因(这比 char* str = "some string" 的问题更难检测 - 其他人已经解释过)是当您使用 constexpr 时。

 constexpr char* str = "some string";

似乎它的行为类似于 const char* str ,因此不会引起警告,因为它发生在 char* 之前,但它的行为却是 char* const str

细节

常量指针,以及指向常量的指针。 const char* strchar* const str 之间的区别可以解释如下。

  1. const char* str :将 str 声明为指向 const char 的指针。这意味着这个指针指向的数据是不变的。可以修改指针,但任何修改数据的尝试都会引发编译错误。
    1. str++ ; :有效。我们正在修改指针,而不是指向的数据。
    2. *str = 'a';无效。我们正在尝试修改指向的数据。
  2. char* const str :将 str 声明为指向 char 的 const 指针。这意味着该点现在是恒定的,但指向的数据也不是。指针无法修改,但我们可以使用指针修改数据。
    1. str++ ;无效。我们正在尝试修改指针变量,它是一个常量。
    2. *str = 'a'; :有效。我们正在尝试修改指向的数据。在我们的例子中,这不会导致编译错误,但会导致 运行时错误,因为字符串很可能会进入已编译二进制文件的只读部分。如果我们动态分配了内存,这个语句就有意义了,例如。 char* const str = new char[5];
  3. const char* const str :将 str 声明为指向 const char 的 const 指针。在这种情况下,我们既不能修改指针,也不能修改指向的数据。
    1. str++ ;无效。我们正在尝试修改指针变量,它是一个常量。
    2. *str = 'a';无效。我们试图修改这个指针指向的数据,它也是常量。

就我而言,问题是我期望 constexpr char* str 表现为 const char* str ,而不是 char* const str ,因为在视觉上它似乎更接近前者。

此外,为 --- 生成的警告与 char* str = "some string" constexpr char* str = "some string" 略有不同。

  1. constexpr char* str = "some string" 的编译器警告: ISO C++11 does not allow conversion from string literal to 'char *const'
  2. char* str = "some string" 的编译器警告: ISO C++11 does not allow conversion from string literal to 'char *'

小费

您可以使用 C gibberish ↔ 英文转换器C 声明转换为易于理解的英文语句,反之亦然。这是 C 唯一的工具,因此不支持 C++ 独有的东西(如 constexpr)。

原文由 Sahil Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题