C ++弃用从string常量到'char *'的转换

我有一个类private char str[256];

为此我有一个明确的构造函数:

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

我把它称为:

 myClass obj("example"); 

当我编译这个时,我得到以下警告:

不推荐将string常量转换为“char *”

为什么发生这种情况?

这是一个错误消息,你会看到每当你有如下情况:

 char* pointer_to_nonconst = "string literal"; 

为什么? 那么,C和C ++在string文字的types上有所不同。 在C中,types是char数组,在C ++中它是char的常量数组。 在任何情况下,你都不允许改变string的字符,所以C ++中的const不是一个限制,而更像是一个types安全的东西。 从const char*char*转换通常是不可能的,因为安全原因没有明确的转换。 但是为了向后兼容C语言,C ++仍然允许将一个string文字分配给一个char*并且给你一个关于这个转换被警告的警告。

所以,somwehere你缺less一个或多个const在你的程序const正确性。 但是您向我们展示的代码不是问题,因为它不会执行这种不赞成使用的转换。 警告必须来自其他地方。

警告:

不推荐将string常量转换为“char *”

是因为你正在做某处(而不是在你发布的代码),如:

 void foo(char* str); foo("hello"); 

问题是你正试图将string文字(types为const char[] )转换为char*

你可以将const char[]转换为const char*因为数组会衰减到指针,但是你正在做的是使一个可变的常量。

这种转换可能允许C兼容性,只是给你提到的警告。

作为答复编号 2 by fnieto – Fernando Nieto明确而正确地描述了这个警告是因为你的代码在某个地方(不是在你发布的代码中)给出的:

 void foo(char* str); foo("hello"); 

然而,如果你想保持你的代码无警告,那么只需在你的代码中进行相应的修改:

 void foo(char* str); foo((char *)"hello"); 

也就是说,只需将string常量转换为(char *)

有3个解决scheme:

解决scheme1:

 const char *x = "foo bar"; 

解决scheme2:

 char *x = (char *)"foo bar"; 

解决scheme3:

 char* x = (char*) malloc(strlen("foo bar")+1); // +1 for the terminator strcpy(x,"foo bar"); 

数组也可以用来代替指针,因为数组已经是一个常量指针了。

事实上,一个string常量字面量既不是一个const char *也不是一个char *,而是一个char []。 它很奇怪,但写在C ++规范; 如果修改它,则行为是未定义的,因为编译器可能会将其存储在代码段中。

我通过在代码的开头添加这个macros来解决这个问题。 或者把它加进<iostream> ,嘿嘿。

  #define C_TEXT( text ) ((char*)std::string( text ).c_str()) 

我也遇到了同样的问题。 而我简单做的只是添加const char *而不是char *。 问题解决了。 正如其他人上面提到的,这是一个兼容的错误。 C把string视为char数组,而C ++将它们视为const char数组。

下面的例子说明了这个解决scheme,把你的string赋给一个variables指针,指向一个常量的char数组(一个string是一个常量指针,指向一个常量字符数组)。

 #include <iostream> void Swap(const char * & left, const char * & right) { const char *const temp = left; left = right; right = temp; } int main() { const char * x = "Hello"; // These works because you are making a variable const char * y = "World"; // pointer to a constant string std::cout << "x = " << x << ", y = " << y << '\n'; Swap(x, y); std::cout << "x = " << x << ", y = " << y << '\n'; }