Я расширяю Python с помощью некоторого кода C++.
Одна из функций, которые я использую, имеет следующую подпись:
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
char *format, char **kwlist, ...);
(ссылка: http://docs.python.org/release/1.5.2p2/ext/parseTupleAndKeywords.html)
Параметр интереса является kwlist. В ссылке выше, даны примеры того, как использовать эту функцию. В примерах kwlist похож:
static char *kwlist[] = {"voltage", "state", "action", "type", NULL};
Когда я компилирую это использование g ++, я получаю предупреждение:
warning: deprecated conversion from string constant to ‘char*’
Так, я могу изменить статический символ* на статическую константу char*. К сожалению, я не могу изменить код Python. Таким образом с этим изменением, я добираюсь, другая ошибка компиляции (не может преобразовать символ ** в символ константы **). На основе того, что я считал здесь, я могу включить флаги компилятора для игнорирования предупреждения, или я могу бросить каждую из постоянных строк в определении kwlist для обугливания *. В настоящее время я делаю последнего. Каковы другие решения?
Извините, если этот вопрос задали прежде. Я являюсь новым.
Ожидает ли PyArg_ParseTupleAndKeywords ()
изменения передаваемых вами данных? Обычно в идиоматическом C ++ a const
указывает на объект, из которого вызываемый будет только читать, тогда как
указывает на объект, который вызываемый может записать. к.
Если PyArg_ParseTupleAndKeywords ()
ожидает, что сможет писать в char *
, через который вы проходите, у вас совершенно другая проблема, помимо той, которую вы упоминаете в своем вопрос.
Если предположить, что PyArg_ParseTupleAndKeywords
не хочет изменять свои параметры, идиоматически верным способом решения этой проблемы было бы объявить kwlist как const char * kwlist []
и использовать const_cast
, чтобы удалить его константность при вызове PyArg_ParseTupleAndKeywords ()
, что заставит его выглядеть так:
PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);