C++ deprecated conversion from string constant to

2018-12-31 19:58发布

I have a class with a private char str[256];

and for it I have an explicit constructor:

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

I call it as:

myClass obj("example");

When I compile this I get the following warning:

deprecated conversion from string constant to 'char*'

Why is this happening?

11条回答
时光乱了年华
2楼-- · 2018-12-31 20:45

The worst part about this is the typical ambiguity in the abuse of the reserved word "string," which leads one to believe, wrongly, that "example".c_str() would resolve the issue.

查看更多
零度萤火
3楼-- · 2018-12-31 20:48

As answer no. 2 by fnieto - Fernando Nieto clearly and correctly describes that this warning is given because somewhere in your code you are doing (not in the code you posted) something like:

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

However, if you want to keep your code warning-free as well then just make respective change in your code:

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

That is, simply cast the string constant to (char *).

查看更多
不流泪的眼
4楼-- · 2018-12-31 20:48

For what its worth, I find this simple wrapper class to be helpful for converting C++ strings to char *:

class StringWrapper {
    std::vector<char> vec;
public:
    StringWrapper(const std::string &str) : vec(str.begin(), str.end()) {
    }

    char *getChars() {
        return &vec[0];
    }
};
查看更多
心情的温度
5楼-- · 2018-12-31 20:51

This is an error message you see whenever you have a situation like the following:

char* pointer_to_nonconst = "string literal";

Why? Well, C and C++ differ in the type of the string literal. In C the type is array of char and in C++ it is constant array of char. In any case, you are not allowed to change the characters of the string literal, so the const in C++ is not really a restriction but more of a type safety thing. A conversion from const char* to char* is generally not possible without an explicit cast for safety reasons. But for backwards compatibility with C the language C++ still allows assigning a string literal to a char* and gives you a warning about this conversion being deprecated.

So, somwehere you are missing one or more consts in your program for const correctness. But the code you showed to us is not the problem as it does not do this kind of deprecated conversion. The warning must have come from some other place.

查看更多
其实,你不懂
6楼-- · 2018-12-31 20:52

There are 3 solutions:

Solution 1:

const char *x = "foo bar";

Solution 2:

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

Solution 3:

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

Arrays also can be used instead of pointers because an array is already a constant pointer.

查看更多
登录 后发表回答