46.4 Standard könyvtári lefedettség és ökoszisztéma-térkép

Ez a fejezet nem új nyelvi elemet tanít, hanem lefedettségi térképet ad: melyik standard fejléc melyik kurzusrészhez visz vissza, és hol húzódik a határ a szabványos könyvtár és a harmadik féltől származó ökoszisztéma között. A „standard fejléc” itt pontos definíció szerint az ISO C vagy ISO C++ szabvány által meghatározott header, amelynek deklarációit a kiválasztott implementáció hosted vagy freestanding módban biztosítja. Elérhetősége nem azonos a teljes funkcionális támogatással: a nyelvi mód, a könyvtár verziója, a hosted/freestanding választás és az implementáció dokumentációja együtt dönt. Ezért a fejléc jelenléte helyett lehetőleg feature-test makrót vagy fordítási próbát használj. A freestanding korlátokat Freestanding, embedded, kernel és GPU irányok (46.3) tárgyalta; a szövegkódolás és random részletei Szövegkódolás, locale és random (32.5), a szinkronizációs primitívek semaphore, latch, barrier és szinkron stream (34.5) alatt találhatók.

46.4.1 C header inventory: C17 és C23

A C17 hosted könyvtára 29 szabványos fejlécből áll. Az alábbi csoportosítás index, nem helyettesíti a fejezetek szerződéseit.

Terület C17 fejlécek
Diagnosztika <assert.h>, <errno.h>
Karakter és szöveg <ctype.h>, <string.h>, <wchar.h>, <wctype.h>, <uchar.h>, <locale.h>
Matematika <complex.h>, <fenv.h>, <float.h>, <math.h>, <tgmath.h>, <limits.h>
I/O és általános eszközök <stdio.h>, <stdlib.h>, <stddef.h>, <stdint.h>, <inttypes.h>, <stdarg.h>, <stdbool.h>, <stdalign.h>, <stdnoreturn.h>, <iso646.h>
Vezérlés, jel, idő <setjmp.h>, <signal.h>, <time.h>
Konkurencia <stdatomic.h>, <threads.h>

A <threads.h> és a <stdatomic.h> támogatása implementációfüggő; a C11 threads különösen gyakran opcionális. A C23 két új fejlécet hoz: <stdbit.h> a bitkezelő makrókhoz, <stdckdint.h> az ellenőrzött egész aritmetikához. A C23 egyetlen C17-es fejlécet sem szüntet meg, de háromnak a tartalma változik, mert a bool, true, false, alignas, alignof kulcsszó lett: a <stdbool.h> már csak az obsolescent __bool_true_false_are_defined makrót adja, a <stdalign.h> üres, a <stdnoreturn.h> és a noreturn makró pedig obsolescent (helyette [[noreturn]]). A headerenkénti C17/C23 táblát a C hordozhatósági audit és freestanding kitekintés (18.4) freestanding szakasza adja; a tényleges támogatást a választott fordító és libc dokumentációja, illetve fordítási próba dönti el, nem a fejléc neve. C17-es fordítással a <stdckdint.h> és <stdbit.h> jellemzően nem része a szabványos környezetnek.

46.4.2 C++ header index kategóriánként

A C++20 alapkönyvtár jóval nagyobb; az alábbi tábla a kurzus szempontjából fontos fejléceket rendeli a korábbi részekhez. A <version> fejléc a feature-test makrók elsődleges forrása, nem maga a funkcionalitás.

Terület Fontos C++20 fejlécek Kurzus
Utility, memória, típusok <utility>, <tuple>, <optional>, <variant>, <any>, <compare>, <type_traits>, <functional>, <memory>, <memory_resource>, <version>, <source_location> optional, variant és visit (31.1), tuple, pair, any és type erasure (31.2), unique_ptr és egyedi tulajdonlás (21.3), Allocator model és allocator_traits (37.1)
Tárolók <array>, <vector>, <deque>, <list>, <forward_list>, <map>, <set>, <unordered_map>, <unordered_set>, <stack>, <queue>, <span>, <bitset> std::array, std::vector és folytonos tárolás (28.1)–Tárolóválasztási és invalidációs labor (28.6), span, byte és bounds-szerződések (31.3)
Iteratorok, algoritmusok, ranges <iterator>, <algorithm>, <numeric>, <execution>, <ranges> Iterator-kategóriák és fél-nyílt tartomány (29.1)–Borrowed range, dangling és iterator lifetime (30.5)
Numerika <cmath>, <complex>, <valarray>, <random>, <ratio>, <numbers>, <bit>, <limits>, <cfenv> Numerikus algoritmusok és kiértékelési sorrend (29.4), Bitműveletek és objektumreprezentáció C++-ban (31.4), Szövegkódolás, locale és random (32.5)
Szöveg, I/O, fájl, idő <string>, <string_view>, <charconv>, <format>, <regex>, <locale>, <iostream>, <fstream>, <sstream>, <filesystem>, <chrono> iostream, stream state és pufferelés (32.1)–Szövegkódolás, locale és random (32.5)
Konkurencia <thread>, <stop_token>, <mutex>, <shared_mutex>, <condition_variable>, <future>, <atomic>, <barrier>, <latch>, <semaphore>, <syncstream>, <coroutine> thread, jthread és kooperatív cancellation (34.1)–Aszinkron I/O adapter és coroutine-labor (35.5)

A C++23-cal bővülő fejlécek, például az <expected>, <print>, <mdspan>, <flat_map>, <flat_set>, <generator>, <stacktrace> és <stdfloat>, külön migrációs táblát igényelnek; elérhetőségüket __cpp_lib_* makróval és a könyvtár verziójával kell ellenőrizni. A <format> C++20-as fejléc, de a tényleges támogatását szintén feature-test mutatja; ha hiányzik, <charconv>-alapú fallback használható.

46.4.3 Ökoszisztéma: mi standard és mi nem

A standard könyvtár és a third-party csomag megkülönböztetése nem formai kérdés. A Boost/Asio, a Catch2, a GoogleTest, a pybind11, a SWIG, a Conan vagy a vcpkg saját verzióval, saját API- és ABI-szerződéssel, külön dokumentációval rendelkezik. Ezek nem ISO részek, és nem kerülnek be a <version> feature-test makrói közé. Egy Boost.Asio-s hálózati rétegnél a Boost verziója, a rendszer ABI-ja, a linkelési mód és a fordítási kapcsolók együtt számítanak; a standard <thread> vagy <atomic> jelenléte nem bizonyítja az Asio kompatibilitását. A továbbtanulási forrásokat mindig a projekt saját, verziózott dokumentációjában kell keresni; ez a könyv nem állítja, hogy bármelyik csomag adott kiadása elérhető vagy tesztelt.

46.4.4 Kidolgozott példa: naplófeldolgozó header-térképe

Egy szolgáltatás fájlból olvas, egész számokat parsol, időbélyeget formáz, munkaszálakat indít, majd gracefully leáll. C++20-ban a minimális térkép: <fstream> az olvasáshoz, <string>/<string_view> a szöveghez, <charconv> a számszorzáshoz, <chrono> az időhöz, <thread> és <stop_token> a szálakhoz, <system_error> a hibákhoz. Ha <format> valóban elérhető, a formázás ahhoz kerül; különben marad a <charconv> és a stream-alapú fallback. C17-ben ugyanez <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <errno.h>, valamint opcionálisan <threads.h> és <stdatomic.h>; a hálózat POSIX-rétegen keresztül jön be.

Az alábbi C++20 próba nem a teljes funkcionalitást, hanem a feature-test jelenlétét ellenőrzi. Illusztratív kimenet; futási eredményt nem állítok mért tényként.

#include <iostream>
#include <version>

int main() {
#ifdef __cpp_lib_ranges
    std::cout << "ranges: " << __cpp_lib_ranges << '\n';
#else
    std::cout << "ranges: nincs __cpp_lib_ranges\n";
#endif
#ifdef __cpp_lib_format
    std::cout << "format: " << __cpp_lib_format << '\n';
#else
    std::cout << "format: nincs __cpp_lib_format\n";
#endif
#ifdef __cpp_lib_expected
    std::cout << "expected: " << __cpp_lib_expected << '\n';
#else
    std::cout << "expected: nincs __cpp_lib_expected\n";
#endif
#ifdef __cpp_lib_print
    std::cout << "print: " << __cpp_lib_print << '\n';
#else
    std::cout << "print: nincs __cpp_lib_print\n";
#endif
}
c++ -std=c++20 -pedantic-errors -Wall -Wextra probe.cpp -o probe

C oldalon a __STDC_VERSION__ és a __has_include(<stdckdint.h>) hasonló próbát ad; a cc -std=c17 és cc -std=c23 külön buildprofil. A fordító tényleges verzióját rögzíteni kell, mert a cc/c++ mögötti implementáció nem univerzális.

46.4.5 Tipikus hibák

46.4.6 Feladatok

  1. Alap: Sorolja be a <stdckdint.h>, <threads.h>, <complex.h>, <expected>, <ranges> és <filesystem> fejléceket nyelv, szabványverzió és fő szerep szerint.
  2. Közepes: Egy C++20 program fájlt olvas, int értékeket parsol, időt mér, két szálat indít, és hibát jelent. Adja meg a minimális fejlécfelsorolást, és jelölje, melyik elemhez kell feature-test.
  3. Haladó: Egy build Boost.Asio-t és Catch2-t használ, valamint <format>-et. Készítsen audit-táblát arról, mi standard, mi third-party, és milyen ellenőrzés szükséges a verzió, az ABI és a funkcionalitás igazolására.

46.4.7 Megoldások

46.4.7.1 1. feladat megoldása

<stdckdint.h> C23, ellenőrzött egész aritmetika; <threads.h> C11/C17 opcionális szálkezelés; <complex.h> C17 komplex számok; <expected> C++23 hibavisszaadási típus; <ranges> C++20 ranges; <filesystem> C++17 fájlrendszer. Ellenőrzés: a nyelvi mód (-std=c17, -std=c23, -std=c++20) és a feature-test makró együtt dönt, nem a fejléc neve önmagában.

46.4.7.2 2. feladat megoldása

Minimális C++20 felsorolás: <fstream>, <string>, <charconv>, <chrono>, <thread>, <stop_token>, <system_error>, <vector>. A <format> csak akkor kerül be, ha __cpp_lib_format elérhető; különben <charconv> és stream-alapú kiírás a fallback. Ellenőrzés: -std=c++20 fordítás, a __cpp_lib_format és a szálkönyvtár tényleges linkelése; a puszta include siker nem elég.

46.4.7.3 3. feladat megoldása

Standard: <format> és a C++20 alapfejlécek; third-party: Boost.Asio és Catch2. Az audit táblázatban külön sor szerepel a Boost és a Catch2 verziójára, a fordítási ABI-ra, a linkelési rendre és a package manager által rögzített csomagazonosítóra. A <version> csak a standard library feature-testjeit mutatja, a Boost/Catch2 verzióját nem. Ellenőrzés: reprodukálható buildprofil, a third-party fejlécek include-útja nem keveredik a standard include-okkal, és a <format> hiányára dokumentált fallback van.