API- und ABI-Versionierung
**************************


Versionskonstanten zur Kompilierungszeit
========================================

CPython gibt seine Versionsnummer über die folgenden Makros bekannt.
Beachte, dass diese dem Versionscode entsprechen, mit dem das Programm
**kompiliert** wurde. Informationen zur **Laufzeit** verwendeten
Version finden Sie unter "Py_Version".

Eine Erörterung der API- und ABI-Stabilität über verschiedene
Versionen hinweg findest du unter C API Stability.

PY_MAJOR_VERSION

   Die  "3"  unter "3.4.1a2".

PY_MINOR_VERSION

   Die  "4"  unter "3.4.1a2".

PY_MICRO_VERSION

   Die "1"  unter "3.4.1a2".

PY_RELEASE_LEVEL

   Die  "a"  unter "3.4.1a2". Dies kann "0xA" für die Alpha-Version,
   "0xB" für die Beta-Version, "0xC" für den Release Candidate oder
   "0xF" für die finale Version sein.

PY_RELEASE_SERIAL

   Die  "2"  unter "3.4.1a2". Keine für endgültige Veröffentlichungen.

PY_VERSION_HEX

   Die Python-Versionsnummer, kodiert als einzelne Ganzzahl.
   Einzelheiten zur Kodierung findest du unter
   "Py_PACK_FULL_VERSION()".

   Verwenden dies für numerische Vergleiche, zum Beispiel: "#if
   PY_VERSION_HEX >= ...".

Diese Makros sind unter Include/patchlevel.h definiert.


Laufzeitversion
===============

const unsigned long Py_Version
    * Teil der Stable ABI seit Version 3.11.*

   Die Versionsnummer der Python-Laufzeitumgebung, kodiert als
   einzelne konstante Ganzzahl. Einzelheiten zur Kodierung findest du
   unter "Py_PACK_FULL_VERSION()". Diese enthält die zur Laufzeit
   verwendete Python-Version.

   Verwende dies für numerische Vergleiche, zum Beispiel: "if
   (Py_Version >= ...)".

   Added in version 3.11.


Bit-Packing-Makros
==================

uint32_t Py_PACK_FULL_VERSION(int major, int minor, int micro, int release_level, int release_serial)
    * Teil der Stable ABI seit Version 3.14.*

   Gibt die angegebene Version zurück, kodiert als einzelne 32-Bit-
   Ganzzahl mit folgender Struktur:

   +--------------------+---------+------------------+-------------+---------------+--------------+
   | Argument           | Anzahl  | Bitmaske         | Bitverschi  | Beispielwerte                |
   |                    | der     |                  | ebung       |                              |
   |                    | Bits    |                  |             |                              |
   |                    |         |                  |             +---------------+--------------+
   |                    |         |                  |             | "3.4.1a2"     | "3.10.0"     |
   |                    |         |                  |             |               |              |
   |                    |         |                  |             |               |              |
   |====================|=========|==================|=============|===============|==============|
   | *Hauptversion      | 8       | "0xFF000000"     | 24          | "0x03"        | "0x03"       |
   | (major)*           |         |                  |             |               |              |
   +--------------------+---------+------------------+-------------+---------------+--------------+
   | *Nebenversion      | 8       | "0x00FF0000"     | 16          | "0x04"        | "0x0A"       |
   | (minor)*           |         |                  |             |               |              |
   +--------------------+---------+------------------+-------------+---------------+--------------+
   | *micro*            | 8       | "0x0000FF00"     | 8           | "0x01"        | "0x00"       |
   +--------------------+---------+------------------+-------------+---------------+--------------+
   | *release_level*    | 4       | "0x000000F0"     | 4           | "0xA"         | "0xF"        |
   +--------------------+---------+------------------+-------------+---------------+--------------+
   | *release_serial*   | 4       | "0x0000000F"     | 0           | "0x2"         | "0x0"        |
   +--------------------+---------+------------------+-------------+---------------+--------------+

   Zum Beispiel:

   +---------------+--------------------------------------+-------------------+
   | Version       | "Py_PACK_FULL_VERSION" Argumente     | Kodierte Version  |
   |===============|======================================|===================|
   | "3.4.1a2"     | "(3, 4, 1, 0xA, 2)"                  | "0x030401a2"      |
   +---------------+--------------------------------------+-------------------+
   | "3.10.0"      | "(3, 10, 0, 0xF, 0)"                 | "0x030a00f0"      |
   +---------------+--------------------------------------+-------------------+

   Bits in den Argumenten, die außerhalb des zulässigen Bereichs
   liegen, werden ignoriert. Das heißt, das Makro kann wie folgt
   definiert werden:

      #ifndef Py_PACK_FULL_VERSION
      #define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \
         (((X) & 0xff) << 24) |                              \
         (((Y) & 0xff) << 16) |                              \
         (((Z) & 0xff) << 8) |                               \
         (((LEVEL) & 0xf) << 4) |                            \
         (((SERIAL) & 0xf) << 0))
      #endif

   "Py_PACK_FULL_VERSION" ist in erster Linie ein Makro, das für die
   Verwendung in  "#if" -Direktiven vorgesehen ist, steht aber auch
   als exportierte Funktion zur Verfügung.

   Added in version 3.14.

uint32_t Py_PACK_VERSION(int major, int minor)
    * Teil der Stable ABI seit Version 3.14.*

   Entspricht  "Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)" . Das
   Ergebnis entspricht keiner Python-Version, ist jedoch bei
   numerischen Vergleichen nützlich.

   Added in version 3.14.
