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'; }