2010-04-08 26 views
8

Ich erweitere Python mit etwas C++ Code.Python zu C/C++ const char Frage

Eine der Funktionen Ich verwende hat die folgende Signatur:

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

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

Der Parameter von Interesse ist kwlist. Im obigen Link finden Sie Beispiele zur Verwendung dieser Funktion. In den Beispielen kwlist wie folgt aussieht:

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

Wenn ich diese mit g ++ kompiliert, erhalte ich die Warnung:

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

Also, ich kann die statische char * zu einem statischen const char * ändern. Leider kann ich den Python-Code nicht ändern. Mit dieser Änderung bekomme ich einen anderen Kompilierungsfehler (kann char ** nicht in const char ** umwandeln). Basierend auf dem, was ich hier gelesen habe, kann ich Compiler-Flags aktivieren, um die Warnung zu ignorieren, oder ich kann jede der konstanten Zeichenfolgen in der Definition von kwlist in char * umwandeln. Momentan mache ich Letzteres. Was sind andere Lösungen?

Entschuldigung, wenn diese Frage schon einmal gestellt wurde. Ich bin neu.

Antwort

4

Erwartet PyArg_ParseTupleAndKeywords() erwarten, die Daten zu ändern, die Sie übergeben? Normalerweise zeigt in idiomatischem C++ ein const <something> * auf ein Objekt, von dem der Angerufene nur liest, wohingegen <something> * auf ein Objekt zeigt, auf das der Angerufene schreiben kann.

Wenn PyArg_ParseTupleAndKeywords() erwartet, in der Lage zu sein, an die char * zu schreiben, die Sie vorbeigehen, haben Sie ein völlig anderes Problem über das hinaus, was Sie in Ihrer Frage erwähnen.

Unter der Annahme, dass PyArg_ParseTupleAndKeywords will nicht seine Parameter ändern, die idiomatisch richtige Weg, um mit diesem Problem umzugehen wäre zu erklären kwlist als const char *kwlist[] und verwenden const_cast seine const-ness zu entfernen, wenn PyArg_ParseTupleAndKeywords() Aufruf welcher würde es so aussehen lassen :

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

Ich bin mir ziemlich sicher, PyArg_ParseTupleAndKeywords() erwartet nicht, kwlist zu ändern. Ihr Vorschlag ist hilfreich. Vielen Dank. – Eugene

0

vor einer akzeptierte Antwort aus sieben Jahren gibt es, aber ich möchte eine alternative Lösung hinzuzufügen, da dieses Thema nach wie vor relevant zu sein scheint.


Wenn Sie nicht wie die const_cast Lösung, Sie können auch eine Schreib-able Version des String-Array erstellen.

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

Die char name[] = ".." kopiert die Zeichenfolge an einen beschreibbaren Speicherort.

Verwandte Themen