Вопрос о const char с Python на C/C++

Я расширяю 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*’

Итак, я могу изменить static char* на static const char*. К сожалению, я не могу изменить код Python. Итак, с этим изменением я получаю другую ошибку компиляции (не могу преобразовать char** в const char**). Основываясь на том, что я здесь прочитал, я могу включить флаги компилятора, чтобы игнорировать предупреждение, или я могу привести каждую из постоянных строк в определении kwlist к char *. В настоящее время я занимаюсь последним. Какие есть другие решения?

Извините, если этот вопрос уже был задан. Я новенький.


person Eugene    schedule 08.04.2010    source источник


Ответы (2)


Ожидает ли PyArg_ParseTupleAndKeywords() изменение данных, которые вы передаете? Обычно в идиоматическом C++ const <something> * указывает на объект, из которого вызываемый объект будет только читать, тогда как <something> * указывает на объект, в который вызываемый объект может записывать.

Если PyArg_ParseTupleAndKeywords() ожидает, что сможет писать в char *, через который вы проходите, у вас есть совершенно другая проблема помимо того, что вы упоминаете в своем вопросе.

Предполагая, что PyArg_ParseTupleAndKeywords не хочет изменять свои параметры, идиоматически правильным способом решения этой проблемы было бы объявить kwlist как const char *kwlist[] и использовать const_cast для удаления его константности при вызове PyArg_ParseTupleAndKeywords(), что сделало бы его следующим:

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);
person Timo Geusch    schedule 08.04.2010
comment
Я почти уверен, что PyArg_ParseTupleAndKeywords() не ожидает изменения kwlist. Ваше предложение полезно. Спасибо. - person Eugene; 08.04.2010

Есть принятый ответ семилетней давности, но я хотел бы добавить альтернативное решение, поскольку эта тема кажется все еще актуальной.


Если вам не нравится решение const_cast, вы также можете создать доступную для записи версию массива строк.

char s_voltage[] = "voltage";
char s_state[] = "state";
char s_action[] = "action";
char s_type[] = "type";
char *kwlist[] = {s_voltage, s_state, s_action, s_type, NULL};

char name[] = ".." копирует вашу строку в доступное для записи место.

person sauerburger    schedule 29.11.2017