Разъясните, плиз, суть ошибки

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 1 сен 2015.

  1. AlexVS

    AlexVS Гик

    Код (Text):
    warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
            if (matchTag("<Tm>"))
                                ^
    Вызываемая функция:
    Код (Text):
    boolean matchTag (char* searchTag)
    {
        if ( strcmp(tagStr, searchTag) == 0 )
            return true;
        else
            return false;
    }
    И как правильно писать, что бы ее не было?
     
  2. Unixon

    Unixon Оракул Модератор

    Вы передаете указатель на константу, но функция думает, что это указатель на переменную и может ее изменить, что в свою очередь может привести к странным багам в неожиданных местах. Компилятор, видя это безобразие, пытается вас предупредить о потенциальных неприятностях.

    Правильно так
    Код (Text):
    boolean matchTag (char * const searchTag)
     
    Последнее редактирование: 1 сен 2015
    AlexVS нравится это.
  3. AlexVS

    AlexVS Гик

    Хм, понятно. Правда const, надо подставить перед char *.
    Ох уж эти строки....... Как бы их постигнуть раз и навсегда......
     
  4. Unixon

    Unixon Оракул Модератор

    Нет, это разные вещи.
    char * - неконстантный указатель на неконстантную строку
    const char * - константный указатель на неконстантную строку (то же самое char const *)
    char * const - неконстантный указатель на константную строку
    const char * const - константный указатель на константную строку
     
    Последнее редактирование: 1 сен 2015
    SOLOway и AlexVS нравится это.
  5. AlexVS

    AlexVS Гик

    Еще раз спасибо за разъяснения!
    А в даном случае нужно именно не константный указатель на константную строку?
    Код (Text):
    boolean matchTag (char const * searchTag)
    Потому что при вызове
    Код (Text):
    if (matchTag("<Tm>"))
    "Tm" - это фактически константа?
     
  6. Unixon

    Unixon Оракул Модератор

    Указатель тоже может быть константой, хоть это и не обязательно.

    Да.

    p.s. Выше я поправил немного, обратите внимание.
     
  7. AlexVS

    AlexVS Гик

    А вот в такой формулировке
    Код (Text):
    boolean COTTAGE::matchTag (char * const searchTag)
    ошибка, вернее предупреждение, вернулось.
     
  8. Unixon

    Unixon Оракул Модератор

    Ну попробуйте все константой сделать.