Как избавиться от `устаревшего преобразования из строковой константы в предупреждения '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 ]

0 голосов
/ 24 августа 2010

см. Эту ситуацию:

typedef struct tagPyTypeObject
{
    PyObject_HEAD;
    char *name;
    PrintFun print;
    AddFun add;
    HashFun hash;
} PyTypeObject;

PyTypeObject PyDict_Type=
{
    PyObject_HEAD_INIT(&PyType_Type),
    "dict",
    dict_print,
    0,
    0
};

смотреть поле имени, в gcc оно компилируется без предупреждения, но в g ++ это будет, я не знаю почему.

0 голосов
/ 16 сентября 2008

Проблема сейчас в том, что я работаю с -Werror

Это твоя настоящая проблема, ИМО. Вы можете попробовать некоторые автоматизированные способы перехода от (char *) к (const char *), но я бы положил деньги на них, а не просто на работу. Вам придется привлекать человека, по крайней мере, для выполнения некоторых работ. В краткосрочной перспективе просто проигнорируйте предупреждение (но IMO оставьте его включенным, иначе оно никогда не исправится) и просто удалите -Werror.

0 голосов
/ 06 мая 2009

Вы также можете создать доступную для записи строку из строковой константы, вызвав strdup().

Например, этот код генерирует предупреждение:

putenv("DEBUG=1");

Однако следующий код этого не делает (он делает копию строки в куче перед передачей ее putenv):

putenv(strdup("DEBUG=1"));

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

Послушайте, что говорит вам компилятор!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...