Python 3 имеет другой и более простой синтаксис для вызова родительского метода. Если класс Foo
наследуется от Bar
, то из Bar.__init__
можно вызвать из Foo
с помощью super().__init__()
:
class Foo(Bar):
def __init__(self):
super().__init__()
Я полагаю, что передача -Wno-write-strings
к gcc подавит это предупреждение.
Если это - активная кодовая база, Вы могли бы все еще хотеть обновить кодовую базу. Конечно, выполнение изменений вручную не выполнимо, но я полагаю, что эта проблема могла быть решена раз и навсегда одним синглом sed
команда. Я не попробовал его, тем не менее, так возьмите следующее с мелкой частицей соли.
find . -exec sed -E -i .backup -n \
-e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
Это не могло бы найти все места (даже не рассматривающий вызовы функции), но это облегчит проблему и позволит выполнить несколько остающихся изменений вручную.
проблема прямо сейчас состоит в том, что я работаю с-Werror
, Это - Ваша настоящая проблема, IMO. Можно попробовать некоторые автоматизированные способы переместиться от (символ *) к (символ константы *), но я поместил бы деньги на них не просто работа. Необходимо будет вовлечь человека, по крайней мере, для части работы. В течение короткого срока просто проигнорируйте предупреждение (но IMO оставляют его на, или это никогда не будет фиксироваться), и просто удалите-Werror.
Проверьте gcc's Диагностическая Прагма поддержка и список опции предупреждения Вт (измененный: новая ссылка на предупреждение опций ).
Для gcc, можно использовать #pragma warning
директивы как объясненный здесь .
Почему Вы не используете -Wno-deprecated
опция проигнорировать удержанные от использования предупреждающие сообщения?
У меня была подобная проблема, я решил ее как это:
#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
).
Объявите строку, поскольку const
решит проблему:
char const*s = "constant string";
Вы также можете создать доступную для записи строку из строковой константы, вызвав strdup ()
.
Например, этот код генерирует предупреждение:
putenv("DEBUG=1");
Однако, следующий код этого не делает (он делает копию строки в куче перед передачей ее в putenv
):
putenv(strdup("DEBUG=1"));
В этом случае (и, возможно, в большинстве других) отключение предупреждения является плохой идеей - это там по причине. Другая альтернатива (создание по умолчанию всех строк для записи) потенциально неэффективна.
Послушайте, что говорит вам компилятор!
Я не могу использовать переключатель компилятора. Итак, я превратил это:
char *setf = tigetstr("setf");
в это:
char *setf = tigetstr((char *)"setf");
Тестовая строка
является строкой const. Таким образом, вы можете решить так:
char str[] = "Test string";
или:
const char* str = "Test string";
printf(str);
смотрите такую ситуацию:
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++ будет, не знаю почему.