# 4. Створення розширень C і C++

Розширення C для CPython — це спільна бібліотека (наприклад, файл `.so` у Linux, `.pyd` у Windows), яка експортує функцію ініціалізації.

To be importable, the shared library must be available on `PYTHONPATH`, and must be named after the module name, with an appropriate extension. When using setuptools, the correct filename is generated automatically.

Функція ініціалізації має сигнатуру:

PyObject *PyInit_modulename(void)

It returns either a fully initialized module, or a `PyModuleDef` instance. See Ініціалізація модулів C for details.

Для модулів із іменами лише у форматі ASCII функція має мати назву `PyInit_ <modulename>`, при цьому `<modulename>` замінюється назвою модуля. При використанні Багатофазова ініціалізація дозволені назви модулів, відмінні від ASCII. У цьому випадку ім’я функції ініціалізації – `PyInitU_ <modulename>`, де `<modulename>` закодовано з використанням punycode кодування Python із дефісами, заміненими підкресленням. У Python:

    def initfunc_name(name):
        try:
            suffix = b'_' + name.encode('ascii')
        except UnicodeEncodeError:
            suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
        return b'PyInit' + suffix

Можна експортувати кілька модулів з однієї спільної бібліотеки, визначивши кілька функцій ініціалізації. Однак для їх імпортування потрібно використовувати символічні посилання або спеціальний імпортер, оскільки за замовчуванням знайдено лише функцію, яка відповідає назві файлу. Подробиці див. у розділі «Кілька модулів в одній бібліотеці» у PEP 489.

## 4.1. Building C and C++ Extensions with setuptools

Python 3.12 and newer no longer come with distutils. Please refer to the `setuptools` documentation at https://setuptools.readthedocs.io/en/latest/setuptools.html to learn more about how build and distribute C/C++ extensions with setuptools.