Как избавиться от `устаревшего преобразования из строковой константы в предупреждения 'char *'` в GCC? - PullRequest
397 голосов
/ 12 сентября 2008

Итак, я работаю над чрезвычайно большой кодовой базой, и недавно она была обновлена ​​до gcc 4.3, который теперь вызывает это предупреждение:

предупреждение: устаревшее преобразование из строковой константы в 'char * ’

Очевидно, что правильный способ исправить это - найти каждое объявление вроде

char *s = "constant string";

или вызов функции, такой как:

void foo(char *s);
foo("constant string");

и сделайте из них const char указатели. Однако это означало бы касание как минимум 564 файлов, что не является задачей, которую я хочу выполнить в данный момент. Проблема сейчас в том, что я работаю с -werror, поэтому мне нужен какой-то способ подавить эти предупреждения. Как я могу это сделать?

Ответы [ 23 ]

547 голосов
/ 01 июня 2013

Любые функции, в которые вы передаете строковые литералы "I am a string literal", должны использовать char const * в качестве типа вместо char*.

Если вы собираетесь что-то исправить, исправьте это правильно.

Пояснение:

Вы не можете использовать строковые литералы для инициализации строк, которые будут изменены, потому что они имеют тип const char*. Отмена константности для последующего их изменения - это неопределенное поведение , поэтому вы должны скопировать свои const char* строки char на char в динамически распределенные строки char*, чтобы изменить их.

* * Пример тысячи двадцать-одина: * ** 1023 тысячу двадцать две *

#include <iostream>

void print(char* ch);

void print(const char* ch) {
    std::cout<<ch;
}

int main() {
    print("Hello");
    return 0;
}
217 голосов
/ 12 сентября 2008

Я считаю, что передача -Wno-write-strings в gcc подавит это предупреждение.

69 голосов
/ 12 сентября 2008

Проверьте поддержку gcc Diagnostic Pragma и список -W параметров предупреждения (изменено: новая ссылка на параметры предупреждения ).

Для gcc вы можете использовать директивы #pragma warning, как объяснено здесь .

68 голосов
/ 12 февраля 2009

У меня была похожая проблема, я решил ее так:

#include <string.h>

extern void foo(char* m);

int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");

    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

Это подходящий способ решения этой проблемы? У меня нет доступа к foo, чтобы адаптировать его для принятия const char*, хотя это было бы лучшим решением (поскольку foo не меняет m).

29 голосов
/ 12 сентября 2008

Если это активная кодовая база, вы все равно можете обновить кодовую базу. Конечно, внесение изменений вручную невозможно, но я считаю, что эту проблему можно решить раз и навсегда с помощью одной команды sed. Однако я не пробовал, поэтому возьмите с солью следующее.

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

Это может не найти все места (даже если не учитывать вызовы функций), но это уменьшит проблему и даст возможность выполнить несколько оставшихся изменений вручную.

25 голосов
/ 15 ноября 2011

Вот как это сделать в файле, поэтому вам не нужно изменять ваш Makefile.

// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"

Вы можете потом позже ...

#pragma GCC diagnostic pop
25 голосов
/ 09 октября 2015

Заменить

char *str = "hello";

с

char *str = (char*)"hello";

или если вы вызываете функцию:

foo("hello");

замените это на

foo((char*) "hello");
25 голосов
/ 21 августа 2009

Я не могу использовать переключатель компилятора. Итак, я превратил это:

char *setf = tigetstr("setf");

к этому:

char *setf = tigetstr((char *)"setf");
15 голосов
/ 15 мая 2015

В C ++ используйте const_cast, как показано ниже

char* str = const_cast<char*>("Test string");
15 голосов
/ 04 октября 2014

Вместо:

void foo(char *s);
foo("constant string");

Это работает:

void foo(const char s[]);
foo("constant string");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...