8

この単純なコードがあるのはなぜですか

void voidFunct() {
      printf("voidFunct called!!!\n");
}

私はそれをダイナミックライブラリとしてコンパイルします

gcc -c LSB.c -o LSB.o 
gcc -shared -Wl -o libLSB.so.1 LSB.o 

そして、ctypesを使用して、Pythonインタープリターから関数を呼び出します

>>> from ctypes import *
>>> dll = CDLL("./libLSB.so.1")
>>> return = dll.voidFunct()
voidFunct called!!!
>>> print return
17

voidメソッドから返される値がそう17でないNone、または類似しているのはなぜですか?ありがとうございました。

4

2 に答える 2

31

ドキュメントから:

class ctypes.CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False)

このクラスのインスタンスは、ロードされた共有ライブラリを表します。これらのライブラリの関数は、標準の C 呼び出し規則を使用し、int を返すと想定されています。

要するに、voidFunct() をintvoid ではなく を返す関数として定義したため、Python はそれが an を返すことを期待していますint(これは、どういうわけか、とにかく、たまたまランダムな値であるだけです)。

おそらくすべきことは、戻り値の型を明示的に宣言することですNone

dll.voidFunct.restype = None
于 2011-05-20T14:50:07.473 に答える
7

それは未定義の動作です。ctypes に、そこにない戻り値を読み取るように要求しています。スタックから何かを読み取りますが、戻ってくるものは定義されていません。

于 2011-05-20T14:47:21.827 に答える