2010-04-08 20 views
8

Extiendo Python con algún código C++.Python a C/C++ const char pregunta

Una de las funciones que estoy usando tiene la siguiente firma:

int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, 
           char *format, char **kwlist, ...); 

(enlace: http://docs.python.org/release/1.5.2p2/ext/parseTupleAndKeywords.html)

El parámetro de interés es kwlist. En el enlace de arriba, se dan ejemplos sobre cómo usar esta función. En los ejemplos, kwlist parece:

static char *kwlist[] = {"voltage", "state", "action", "type", NULL}; 

Cuando compilo este usando g ++, me sale la advertencia:

warning: deprecated conversion from string constant to ‘char*’ 

Por lo tanto, se puede cambiar el char * estático a un const char estática *. Lamentablemente, no puedo cambiar el código de Python. Entonces, con este cambio, obtengo un error de compilación diferente (no puedo convertir char ** en const char **). Según lo que he leído aquí, puedo activar los indicadores del compilador para ignorar la advertencia o puedo convertir cada una de las cadenas constantes en la definición de kwlist en char *. Actualmente, estoy haciendo esto último. ¿Cuáles son otras soluciones?

Lo sentimos si esta pregunta se ha formulado antes. Soy nuevo.

Respuesta

4

¿PyArg_ParseTupleAndKeywords() espera modificar los datos que está pasando? Normalmente, en C++ idiomático, un const <something> * apunta a un objeto que el destinatario solo leerá, mientras que <something> * apunta a un objeto que el destinatario puede escribir.

Si PyArg_ParseTupleAndKeywords() espera poder escribir en el char * que está pasando, tiene un problema completamente diferente a lo que menciona en su pregunta.

Suponiendo que PyArg_ParseTupleAndKeywords no quiere modificar sus parámetros, la forma idiomática correcta de hacer frente a este problema sería declarar kwlist como const char *kwlist[] y utilizar const_cast para eliminar su const-dad al llamar PyArg_ParseTupleAndKeywords(), que sería hacer que parezca que esta :

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...); 
+0

Estoy bastante seguro de que PyArg_ParseTupleAndKeywords() no espera modificar kwlist. Tu sugerencia es útil. Gracias. – Eugene

0

hay una respuesta aceptado desde hace siete años, pero me gustaría añadir una solución alternativa, ya que este tema parece seguir siendo relevante.


Si no te gusta la solución const_cast, también puede crear una versión de escritura-poder de la matriz de cadenas.

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

Los char name[] = ".." copia la cadena de una ubicación grabable.