Как избавиться от «устаревшего преобразования из строковой константы в предупреждения« char * »в GCC?

Python 3 имеет другой и более простой синтаксис для вызова родительского метода. Если класс Foo наследуется от Bar, то из Bar.__init__ можно вызвать из Foo с помощью super().__init__():

class Foo(Bar):
    def __init__(self):
        super().__init__()
400
задан Edward Karak 21 April 2016 в 22:01
поделиться

11 ответов

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

222
ответ дан Tim Cooper 21 April 2016 в 22:01
поделиться
  • 1
    В комментариях " Yoda может быть bad" автор отмечает что " foo" .equals (панель), случай является особым случаем, где лучше yoda. – valbaca 1 July 2013 в 21:27

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

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

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

30
ответ дан Konrad Rudolph 21 April 2016 в 22:01
поделиться

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

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

0
ответ дан James Antill 21 April 2016 в 22:01
поделиться

Проверьте gcc's Диагностическая Прагма поддержка и список опции предупреждения Вт (измененный: новая ссылка на предупреждение опций ).

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

69
ответ дан Community 21 April 2016 в 22:01
поделиться
  • 1
    Эй это - нормальный способ установить шрифт, вопрос был для использования пользовательского шрифта по умолчанию в XML. – Vins 6 August 2013 в 05:46

Почему Вы не используете -Wno-deprecated опция проигнорировать удержанные от использования предупреждающие сообщения?

0
ответ дан Drew Noakes 22 April 2016 в 08:01
поделиться

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

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

69
ответ дан LogicStuff 22 April 2016 в 08:01
поделиться
  • 1
    " Эта переменная не доступна, когда register_argc_argv является disabled". – DanMan 17 September 2013 в 22:28

Объявите строку, поскольку const решит проблему:

char const*s = "constant string";
-1
ответ дан 22 November 2019 в 23:38
поделиться

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

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

putenv("DEBUG=1");

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

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

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

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

0
ответ дан 22 November 2019 в 23:38
поделиться

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

char *setf = tigetstr("setf");

в это:

char *setf = tigetstr((char *)"setf");
25
ответ дан 22 November 2019 в 23:38
поделиться

Тестовая строка является строкой const. Таким образом, вы можете решить так:

char str[] = "Test string";

или:

const char* str = "Test string";
printf(str);
7
ответ дан 22 November 2019 в 23:38
поделиться

смотрите такую ​​ситуацию:

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
};

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

0
ответ дан 22 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: