我有一堂课是 private char str[256];
为此我有一个显式的构造函数:
explicit myClass(const char *func)
{
strcpy(str,func);
}
我称之为:
myClass obj("example");
当我编译它时,我收到以下警告:
不推荐将字符串常量转换为 ‘char*’
为什么会这样?
原文由 mkamthan 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一堂课是 private char str[256];
为此我有一个显式的构造函数:
explicit myClass(const char *func)
{
strcpy(str,func);
}
我称之为:
myClass obj("example");
当我编译它时,我收到以下警告:
不推荐将字符串常量转换为 ‘char*’
为什么会这样?
原文由 mkamthan 发布,翻译遵循 CC BY-SA 4.0 许可协议
这个问题的一个原因(这比 char* str = "some string"
的问题更难检测 - 其他人已经解释过)是当您使用 constexpr
时。
constexpr char* str = "some string";
似乎它的行为类似于 const char* str
,因此不会引起警告,因为它发生在 char*
之前,但它的行为却是 char* const str
。
常量指针,以及指向常量的指针。 const char* str
和 char* const str
之间的区别可以解释如下。
const char* str
:将 str 声明为指向 const char 的指针。这意味着这个指针指向的数据是不变的。可以修改指针,但任何修改数据的尝试都会引发编译错误。
str++ ;
:有效。我们正在修改指针,而不是指向的数据。*str = 'a';
: 无效。我们正在尝试修改指向的数据。char* const str
:将 str 声明为指向 char 的 const 指针。这意味着该点现在是恒定的,但指向的数据也不是。指针无法修改,但我们可以使用指针修改数据。
str++ ;
: 无效。我们正在尝试修改指针变量,它是一个常量。*str = 'a';
:有效。我们正在尝试修改指向的数据。在我们的例子中,这不会导致编译错误,但会导致 运行时错误,因为字符串很可能会进入已编译二进制文件的只读部分。如果我们动态分配了内存,这个语句就有意义了,例如。 char* const str = new char[5];
。const char* const str
:将 str 声明为指向 const char 的 const 指针。在这种情况下,我们既不能修改指针,也不能修改指向的数据。
str++ ;
: 无效。我们正在尝试修改指针变量,它是一个常量。*str = 'a';
: 无效。我们试图修改这个指针指向的数据,它也是常量。就我而言,问题是我期望 constexpr char* str
表现为 const char* str
,而不是 char* const str
,因为在视觉上它似乎更接近前者。
此外,为 --- 生成的警告与 char* str = "some string"
constexpr char* str = "some string"
略有不同。
constexpr char* str = "some string"
的编译器警告: ISO C++11 does not allow conversion from string literal to 'char *const'
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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
这是您在遇到如下情况时看到的错误消息:
为什么?好吧,C 和 C++ 在字符串文字的类型上有所不同。在 C 中,类型是 char 数组,而在 C++ 中,类型是 char 常量 数组。在任何情况下,您都不允许更改字符串文字的字符,因此 C++ 中的 const 并不是真正的限制,而是更多的类型安全。出于安全原因,如果没有明确的演员表,从
const char*
到char*
的转换通常是不可能的。但是为了与 C 向后兼容,C++ 语言仍然允许将字符串文字分配给char*
并警告您不推荐使用此转换。因此,在您的程序中缺少一个或多个
const
s 以确保 const 正确性。但是您向我们展示的代码不是问题,因为它没有进行这种已弃用的转换。警告一定来自其他地方。