Python для C / C ++ const char вопрос - PullRequest
8 голосов
/ 08 апреля 2010

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

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

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

Ответы [ 2 ]

4 голосов
/ 08 апреля 2010

Ожидает ли 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), ...);
0 голосов
/ 29 ноября 2017

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


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

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[] = ".." копирует вашу строку в доступное для записи место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...