2010-04-08 20 views
8

Rozszerzam Pythona o kod C++.Python to C/C++ const char question

Jedną z funkcji używam ma następujący podpis:

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

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

Parametr zainteresowania jest kwlist. W powyższym linku podano przykłady korzystania z tej funkcji. W przykładach kwlist wygląda następująco:

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

Kiedy mogę skompilować to za pomocą g ++, pojawia się ostrzeżenie:

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

Więc mogę zmienić statyczne char * do statycznej const char *. Niestety nie mogę zmienić kodu Pythona. Z tą zmianą otrzymuję inny błąd kompilacji (nie mogę przekonwertować char ** na const char **). W oparciu o to, co tu przeczytałem, mogę włączyć flagi kompilatorów, aby zignorować ostrzeżenie lub mogę rzucić każdy z ciągłych ciągów w definicji kwlist do char *. Obecnie robię to drugie. Jakie są inne rozwiązania?

Przepraszam, jeśli wcześniej zadano to pytanie. Jestem nowy.

Odpowiedz

4

Czy chcesz zmienić dane, które przekazujesz? Zwykle w idiomatycznym C++, const <something> * wskazuje na obiekt, który odwiedzający odczytuje tylko z niego, podczas gdy <something> * wskazuje obiekt, do którego może pisać osoba wykupująca.

Jeśli chcesz, aby PyArg_ParseTupleAndKeywords() pisał do char *, masz zupełnie inny problem niż to, o czym wspomniałeś w swoim pytaniu.

Zakładając, że PyArg_ParseTupleAndKeywords nie chce zmodyfikować jego parametry, idiomatically poprawny sposób radzenia sobie z tym problemem byłoby zadeklarować kwlist jak const char *kwlist[] i używać const_cast usunąć swój const-ności podczas wywoływania PyArg_ParseTupleAndKeywords(), które sprawiają, że wygląda tak :

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

Jestem prawie pewien PyArg_ParseTupleAndKeywords() nie oczekuje modyfikacji kwlist. Twoja sugestia jest pomocna. Dzięki. – Eugene

0

Istnieje akceptowana odpowiedź sprzed siedmiu lat, ale chciałbym dodać alternatywne rozwiązanie, ponieważ temat ten wydaje się nadal aktualny.


Jeśli nie podoba się rozwiązanie const_cast, można również stworzyć możliwość zapisu wersję tablicy ciągów.

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

Urządzenie char name[] = ".." kopiuje twój ciąg do zapisywalnej lokalizacji.

Powiązane problemy