Day 28.
Давайте представим, что вы разрабатываете какое-нибудь десктопное приложение. У вас есть примерно такой набор файлов:
app.exe
logo.png
config.json
shader.spv
В коде вы работаете с файлами примерно так:
std::ifstream f("config.json");
Какие проблемы? Я вижу такие:
• файл могут забыть положить рядом
• файл могут удалить
• файл могут подменить
• распространять программу неудобно.
В идеале получить просто
app.exe. Достичь этого мы можем с помощью встраивания байтов прямо в исполняемый файл.
Есть несколько вариантов, как это сделать.
Например
xxd -i bytes.bin > bytes.h
С помощью утилиты
xxd и флага -i (указывающего сгенерировать C-код). И далее простой #include "bytes.h".Другие способы:
• objcopy
• inline asm с
.incbin• генерация кода из бинарника любыми другими способами.
Проблема как минимум
xxd в том, что при изменении бинарного файла придётся перезапустить генерацию хедера. Все от этих костылей устали и придумали
#embed (C23):
constexpr unsigned char data[] = {
#embed "file.bin"
};
Всё. Одна директива. Изменения не теряем.
@thisnotes. Patreon, Boosty.
Спасибо Artyom Garkavy и niki4smirn.