[Python-Dev] getter/setter function signatures (original) (raw)

Martin v. Loewis martin@v.loewis.de
18 Apr 2002 14:47:27 +0200


"Thomas Heller" <thomas.heller@ion-tof.com> writes:

At least descrobject.c, cPickle.c and funcobject.c defines PyGetSetDef arrays which use function signatures where the last void* parameter is missing. While obviously this does no harm (so far), it is surely a bug (or am I missing something)?

In the sense of strict C, this is a bug - the function is called with the closure present, so it must also be declared with the closure.

Most C implementations support calls where the caller provides more arguments than the callee consumes, for compatibility with K&R C, so this is not a problem. Still, it should be changed, IMO.

Related: I am always wondering, why the compiler (MSVC 6 in my case) gives a warning when you use these signatures for getter/setter functions

PyObject *get(wrapperobject *, void *) int set(wrapperobject *, PyObject *, void *) (warning C4028: formal parameter 1 different from declaration), while if I use these signatures PyObject *get(PyObject *) int set(PyObject *, PyObject *) the compilation gives no warning at all. Another MSVC glitch?

MSVC is right when giving the warnings about the first set of signatures: You cannot convert PyObject*()(wrapperobject,void*) to PyObject*()(PyObject,void*).

Apparently, it sees no problem with the conversion of PyObject*()(PyObject) to PyObject*()(PyObject,void*), which, again, could be for compatibility with K&R C (function pointer type can be converted if the argument types of one function are an initial sequence of the argument types of the other).

Just see whether compiling in strict C mode changes anything.

Regards, Martin