8

内部 Python API を使用して C/C++ を Python に統合したい場合。次に、関数の署名は次の形式になります

static PyObject *MyFunction( PyObject *self, PyObject *args );

static PyObject *MyFunctionWithKeywords(PyObject *self,
                             PyObject *args,
                             PyObject *kw);

static PyObject *MyFunctionWithNoArgs( PyObject *self );

これらの関数が静的に実装されているのはなぜですか?

4

4 に答える 4

6

ドキュメントから:

したがって、移植性を確保するには、シンボルの可視性について何の仮定もしない必要があります。これは、static他の拡張モジュールとの名前の衝突を避けるために、モジュールの初期化関数を除いて、拡張モジュール内のすべてのシンボルを宣言する必要があることを意味します (セクション モジュールのメソッド テーブルと初期化関数で説明したように)。また、他の拡張モジュールからアクセスできるようにする必要があるシンボルは、別の方法でエクスポートする必要があることを意味します。

于 2013-09-11T15:35:09.097 に答える
2

だからあなたは何staticを意味するのか尋ねています。

つまり、これらの関数は、他の定義と競合せず、名前空間を汚染しないように、関数が宣言されているファイルでのみ使用できます。

これらのファイルが静的である理由は、これらがすべての python 関数がマップされるためです。可能な関数宣言のすべての順列をどのようにカバーするかを確認してください。これらは、そのファイルのここでのみ作成できます。

于 2013-09-11T15:34:13.123 に答える
0

したがって、それらは定義されているファイルでのみ使用できます。グローバルネームスペースを汚染しないため。

于 2013-09-11T15:32:41.950 に答える
0

C の関数の前にあるキーワードstaticは、その関数が定義されている翻訳単位 (大まかに言えば、ヘッダー ファイルがインクルードされた後のソース ファイル) の外では見えないことを意味します。関数に「内部リンケージ」(C 用語で) を与えるため、ファイルに対して「プライベート」になります。

于 2013-09-11T15:33:45.103 に答える