C++ deprecated conversion from string constant to 'char*'

前端 未结 11 1181
傲寒
傲寒 2020-11-22 16:01

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

and for it I have an explicit constructor:

explicit myClass(const char *func)
{
    strcpy(         


        
相关标签:
11条回答
  • 2020-11-22 16:50

    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];
        }
    };
    
    0 讨论(0)
  • 2020-11-22 16:52

    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, somewhere 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.

    0 讨论(0)
  • 2020-11-22 16:53

    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 *).

    0 讨论(0)
  • 2020-11-22 16:54

    I solve this problem by adding this macro in the beginning of the code, somewhere. Or add it in <iostream>, hehe.

     #define C_TEXT( text ) ((char*)std::string( text ).c_str())
    
    0 讨论(0)
  • 2020-11-22 16:55

    The warning:

    deprecated conversion from string constant to 'char*'

    is given because you are doing somewhere (not in the code you posted) something like:

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

    The problem is that you are trying to convert a string literal (with type const char[]) to char*.

    You can convert a const char[] to const char* because the array decays to the pointer, but what you are doing is making a mutable a constant.

    This conversion is probably allowed for C compatibility and just gives you the warning mentioned.

    0 讨论(0)
提交回复
热议问题