@startuml title Механизм работы STB_IMAGE_IMPLEMENTATION !define COMPILATION_COLOR #LightBlue !define PREPROCESSOR_COLOR #LightGreen !define LINKER_COLOR #LightCoral participant "Препроцессор" as PP <> participant "Utility.cpp" as UTIL <> participant "Other.cpp" as OTHER <> participant "stb_image.h" as STB participant "Линковщик" as LINK <> == Компиляция Utility.cpp == UTIL -> UTIL: #define STB_IMAGE_IMPLEMENTATION UTIL -> PP: #include "stb_image.h" PP -> STB: Открывает файл STB -> PP: Строки 1-545:\nОбъявления функций\n(всегда включаются) PP -> PP: Проверка:\n#ifdef STB_IMAGE_IMPLEMENTATION?\nДА! STB -> PP: Строки 547-7800+:\nРеализация функций\n(включается!) PP -> UTIL: Возвращает:\n- Объявления\n- Реализации UTIL -> UTIL: Компиляция:\nОбъектный файл содержит\nкод функций stbi_load и др. == Компиляция Other.cpp == OTHER -> PP: #include "stb_image.h"\n(БЕЗ define) PP -> STB: Открывает файл STB -> PP: Строки 1-545:\nОбъявления функций\n(всегда включаются) PP -> PP: Проверка:\n#ifdef STB_IMAGE_IMPLEMENTATION?\nНЕТ! PP -> OTHER: Возвращает:\nТОЛЬКО объявления OTHER -> OTHER: Компиляция:\nОбъектный файл НЕ содержит\nкод функций, только ссылки == Линковка == UTIL -> LINK: Utility.o:\n✓ Реализация stbi_load OTHER -> LINK: Other.o:\n✗ Только ссылка на stbi_load LINK -> LINK: Связывание:\nOther.o использует\nреализацию из Utility.o LINK --> UTIL: Исполняемый файл:\nОдна копия реализации note right of PP **Ключевой момент:** STB_IMAGE_IMPLEMENTATION определен только в ОДНОМ .cpp файле end note @enduml