Поэтому я работаю над чрезвычайно большой кодовой базой и недавно обновлена до gcc 4.3, который теперь вызывает это предупреждение:
предупреждение: устаревшее преобразование из строковой константы в 'char *'
Очевидно, что правильный способ исправить это - найти каждое объявление как
char *s = "constant string";
или вызов функции как:
void foo(char *s);
foo("constant string");
и сделать их const char
указатели. Однако это означало бы касание как минимум 564 файлов, что не является задачей, которую я хотел бы выполнить в данный момент. Проблема сейчас в том, что я бегу -werror
, поэтому мне нужен какой-то способ подавить эти предупреждения. Как я могу это сделать?
Ответы:
Я верю, что переход
-Wno-write-strings
к gcc подавит это предупреждение.источник
#pragma GCC diagnostic ignored "-Wwrite-strings"
.Любые функции, в которые вы передаете строковые литералы,
"I am a string literal"
должны использоватьchar const *
вместо типаchar*
.Если вы собираетесь что-то исправить, исправьте это правильно.
Объяснение:
Вы не можете использовать строковые литералы для инициализации строк, которые будут изменены, потому что они имеют тип
const char*
. Отбрасывая константность , чтобы позже изменить их в неопределенное поведение , так что вы должны скопироватьconst char*
строкиchar
путемchar
в динамически выделенныхchar*
строк, чтобы изменить их.Пример:
источник
char *
/const char *
, поэтому в этом случае я обычно использую.char*
даже для строк, которые не будут изменены. Если вы возьмете параметр как achar const*
и передадите его в стандартную функцию, тоchar*
вы попадете в него. Если библиотечная функция не будет манипулировать строкой, вы можете отказаться отconst
.У меня была похожая проблема, я решил ее так:
Это подходящий способ решения этой проблемы? У меня нет доступа, чтобы
foo
адаптировать его для принятияconst char*
, хотя это было бы лучшим решением (потомуfoo
что не меняетсяm
).источник
char **
вPyArg_ParseTupleAndKeywords
I сделать что - то вроде этого:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
Проверьте поддержку gcc Diagnostic Pragma и список параметров предупреждения -W (изменено: новая ссылка на параметры предупреждений ).
Для gcc вы можете использовать
#pragma warning
директивы, как описано здесь .источник
Если это активная кодовая база, вы все равно можете обновить кодовую базу. Конечно, внесение изменений вручную невозможно, но я считаю, что эта проблема может быть решена раз и навсегда одной единственной
sed
командой. Я не пробовал, однако, так что возьмите следующее с солью.Это может не найти все места (даже не принимая во внимание вызовы функций), но это уменьшит проблему и позволит выполнить несколько оставшихся изменений вручную.
источник
Я не могу использовать переключатель компилятора. Итак, я превратил это:
к этому:
источник
Вот как это сделать в файле, поэтому вам не нужно изменять ваш Makefile.
Вы можете потом позже ...
источник
замещать
с
или если вы вызываете функцию:
замени это
источник
Вместо:
Это работает:
источник
В C ++ используйте
const_cast
как показано нижеисточник
Test string
константная строка Таким образом, вы можете решить так:или:
источник
Почему бы просто не использовать приведение типов?
источник
Делать типизацию от константной строки до указателя на символ
источник
В C ++ замените:
с:
И если вы хотите сравнить это:
источник
Работая с Arduino Sketch, у меня была функция, вызывающая мои предупреждения.
Чтобы прекратить предупреждения, я добавил const перед char * str и char * sfind.
Все предупреждения ушли.
источник
увидеть эту ситуацию:
смотреть поле имени, в gcc он компилируется без предупреждения, но в g ++ это будет, я не знаю почему.
источник
Вы также можете создать доступную для записи строку из строковой константы, вызвав ее
strdup()
.Например, этот код генерирует предупреждение:
Однако следующий код этого не делает (он делает копию строки в куче, прежде чем передать ее
putenv
):В этом случае (и, возможно, в большинстве других) отключение предупреждения является плохой идеей - оно есть по причине. Другой вариант (по умолчанию все строки доступны для записи) потенциально неэффективен.
Послушайте, что говорит вам компилятор!
источник
putenv()
чреват - он не является хорошим выбором примера (по крайней мере, не без гораздо большего обсуждения того, чтоputenv()
делает, чем есть в этом ответе). Это отдельная дискуссия. (Обратите внимание, что спецификация POSIX для поведенияputenv()
проблематична, на основе устаревших реализаций до того, как был определен POSIX.) IIRC, была ошибка в недавнем (в этом тысячелетии) выпуске библиотеки GNU C, которая была связана сputenv()
изменением поведения, и меняют обратно.)просто используйте опцию -w для g ++
пример:
g ++ -w -o simple.o simple.cpp -lpthread
Помните, что это не предотвращает устаревание, а предотвращает показ предупреждающего сообщения на терминале.
Теперь, если вы действительно хотите избежать устаревания, используйте ключевое слово const:
источник
Почему вы не используете
-Wno-deprecated
опцию, чтобы игнорировать устаревшие предупреждающие сообщения?источник
Это твоя настоящая проблема, ИМО. Вы можете попробовать некоторые автоматизированные способы перехода от (char *) к (const char *), но я бы положил деньги на них, а не просто на работу. Вам придется привлекать человека, по крайней мере, для выполнения некоторых работ. В краткосрочной перспективе просто проигнорируйте предупреждение (но IMO оставьте его включенным, иначе оно никогда не будет исправлено) и просто удалите -Werror.
источник
Спасибо всем за помощь. Выбор здесь и там приходит это решение. Это компилируется чисто. Еще не проверяли код. Может быть, завтра...
Я знаю, есть только 1 элемент в массиве timeServer. Но могло быть и больше. Остальные были закомментированы, чтобы сохранить память.
источник
смотреть поле имени, в gcc он компилируется без предупреждения, но в g ++ это будет, я не знаю почему.
в
gcc (Compiling C)
-Wno-write-strings активен по умолчанию.в
g++ (Compiling C++)
-Wwrite-strings активен по умолчаниюВот почему существует другое поведение. Для нас использование макросов
Boost_python
генерирует такие предупреждения. Поэтому мы используем-Wno-write-strings
при компиляции C ++, так как мы всегда используем-Werror
источник
Объявление строки как
const
решит проблему:источник