Вы буквально пишете PyMODINIT_FUNC PyInit_<module_name>(void)
. Теперь PyMODINIT_FUNC
- это макрос, который распространяется на разные вещи, которые контролируются различными #ifdef
s в pyport.h
. В текущей редакции HEAD в редакции Github версия Python 3.9 имеет следующие 6 определений:
#define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
#define PyMODINIT_FUNC PyObject*
#define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
#define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
#define PyMODINIT_FUNC extern "C" Py_EXPORTED_SYMBOL PyObject*
#define PyMODINIT_FUNC Py_EXPORTED_SYMBOL PyObject*
Т.е. она расширяется до PyObject *
в качестве возвращаемого типа, но также extern "C"
, если компилируется с помощью компилятора C ++ для обеспечения связи C с этим символом и включают Py_EXPORTED_SYMBOL
на некоторых платформах.
Py_EXPORTED_SYMBOL
определяется в exports.h
как одна из
#define Py_EXPORTED_SYMBOL __declspec(dllexport)
#define Py_EXPORTED_SYMBOL __attribute__ ((visibility ("default")))
#define Py_EXPORTED_SYMBOL
Ничто из этого не определяет соглашение о вызовах, вместо этого позволяя функции по умолчанию соответствовать соглашению cdecl, как они должны ... - также имейте в виду, что соглашения о вызовах в основном используются только в Windows.