8

私はいくつかのC++コードでPythonを拡張しています。

私が使用している関数の1つには、次のシグネチャがあります。

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*’

したがって、staticchar*をstaticconstchar*に変更できます。残念ながら、Pythonコードを変更することはできません。したがって、この変更により、別のコンパイルエラーが発生します(char**をconstchar **に変換できません)。ここで読んだ内容に基づいて、警告を無視するようにコンパイラフラグをオンにするか、kwlistの定義内の各定数文字列をchar*にキャストできます。現在、私は後者をやっています。他の解決策は何ですか?

この質問が以前に行われたことがある場合は申し訳ありません。私は新しいです。

4

2 に答える 2

4

PyArg_ParseTupleAndKeywords()渡すデータを変更する予定はありますか?通常、慣用的なC ++では、const <something> *は呼び出し先が読み取るだけ<something> *のオブジェクトを指しますが、呼び出し先は書き込み可能なオブジェクトを指します。

あなたが渡しPyArg_ParseTupleAndKeywords()たあなたに手紙を書くことができることを期待しているなら、char *あなたはあなたがあなたの質問で述べていることとはまったく異なる問題を抱えています。

パラメータを変更したくないと仮定するとPyArg_ParseTupleAndKeywords、この問題を処理する慣習的に正しい方法は、kwlistをとして宣言し、呼び出し時にその定数を削除するためにconst char *kwlist[]使用することです。これにより、次のようになります。const_castPyArg_ParseTupleAndKeywords()

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);
于 2010-04-08T15:50:35.157 に答える
0

7年前から受け入れられた回答がありますが、このトピックはまだ関連しているように思われるので、別の解決策を追加したいと思います。


このソリューションが気に入らない場合const_castは、文字列配列の書き込み可能なバージョンを作成することもできます。

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[] = ".."コピーします。

于 2017-11-29T13:10:07.213 に答える