2010-04-08 7 views
8

J'étend Python avec du code C++.Question de Python à C/C++ const

L'une des fonctions que je utilise a la signature suivante:

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

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

Le paramètre d'intérêt est kwlist. Dans le lien ci-dessus, des exemples d'utilisation de cette fonction sont donnés. Dans les exemples, kwlist ressemble à:

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

Quand je compile cela en utilisant g ++, je reçois l'avertissement:

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

Alors, je peux changer le char * statique à un const statique char *. Malheureusement, je ne peux pas changer le code Python. Donc, avec cette modification, j'obtiens une erreur de compilation différente (impossible de convertir char ** en const char **). Sur la base de ce que j'ai lu ici, je peux activer les drapeaux du compilateur pour ignorer l'avertissement ou je peux convertir chacune des chaînes constantes dans la définition de kwlist en char *. Actuellement, je fais le dernier. Quelles sont les autres solutions?

Désolé si cette question a déjà été posée. Je suis nouveau.

Répondre

4

Est-ce que PyArg_ParseTupleAndKeywords() peut modifier les données que vous transmettez? Normalement, en C++ idiomatique, un const <something> * pointe vers un objet que l'appelé ne lira qu'à partir de lui, alors que <something> * pointe vers un objet auquel l'appelé peut écrire.

Si PyArg_ParseTupleAndKeywords() s'attend à être en mesure d'écrire à la char * vous passez, vous avez un problème entièrement différent au-delà de ce que vous mentionnez dans votre question.

En supposant que PyArg_ParseTupleAndKeywords ne veut pas modifier ses paramètres, la façon idiomatiquement correcte de traiter ce problème serait de déclarer kwlist comme const char *kwlist[] et utiliser const_cast pour enlever sa const-ness lors de l'appel PyArg_ParseTupleAndKeywords() qui ferait ressembler à ce :

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

Je suis sûr que PyArg_ParseTupleAndKeywords() ne s'attend pas à modifier kwlist. Votre suggestion est utile Merci. – Eugene

0

Il y a une réponse acceptée il y a sept ans, mais j'aimerais ajouter une solution alternative, puisque ce sujet semble toujours pertinent.


Si vous n'aimez pas la solution const_cast, vous pouvez également créer une version d'écriture capable de tableau de chaînes.

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

Les char name[] = ".." copie la votre chaîne à un emplacement inscriptible.